Βαθμωτά και συμβολοσειρές · Αριθμητικές συναρτήσεις
oct#
Ερμηνεία μιας συμβολοσειράς ως αριθμού γραμμένου σε οκταδικό, δεκαεξαδικό ή δυαδικό, και επιστροφή του προκύπτοντος ακεραίου.
Το όνομα είναι παραπλανητικό: η oct είναι στην πραγματικότητα ένας αναλυτής προθέματος βάσης. Επιθεωρεί τους αρχικούς χαρακτήρες της EXPR και επιλέγει τη βάση από αυτούς - 0x/x για δεκαεξαδικό, 0b/b για δυαδικό, 0o/o (ή καθόλου πρόθεμα) για οκταδικό. Αν παραλειφθεί η EXPR, η oct λειτουργεί στην $_. Σκεφτείτε την ως το αντίστροφο του sprintf "%o" / "%x" / "%b" για την κοινή περίπτωση όπου έχετε τη συμβολοσειριακή μορφή και χρειάζεστε τον αριθμό.
Σύνοψη#
oct EXPR
oct # operates on $_
Τι επιστρέφεται#
Ένας μη αρνητικός ακέραιος. Η αριθμητική τιμή της EXPR ερμηνευμένη σε όποια βάση επέλεξε το πρόθεμά της (οκταδική από προεπιλογή). Το αποτέλεσμα είναι πάντα >= 0 - η oct δεν αναλύει αρχικό πρόσημο και δεν επιστρέφει τιμές κινητής υποδιαστολής.
Κενή συμβολοσειρά, συμβολοσειρά χωρίς αναγνωρισμένα ψηφία, ή undef επιστρέφει 0.
Κανόνες προθέματος#
Οι αρχικοί χαρακτήρες της EXPR (μετά από τυχόν αρχικούς λευκούς χαρακτήρες, οι οποίοι παραλείπονται σιωπηρά) καθορίζουν τη βάση:
Πρόθεμα | Βάση | Παράδειγμα εισόδου | Αποτέλεσμα |
|---|---|---|---|
| 16 (δεκαεξαδικό) |
|
|
| 2 (δυαδικό) |
|
|
| 8 (οκταδικό) |
|
|
(κανένα) | 8 (οκταδικό) |
|
|
(κανένα, αρχικό | 8 (οκταδικό) |
|
|
Το οκταδικό πρόθεμα 0o/o προστέθηκε στην Perl 5.33.5 για να ταιριάζει με τη σύνταξη κυριολεκτικών ακεραίων· οι παλαιότερες μορφές (0755 και σκέτο 755) ήταν πάντοτε οκταδικές.
Οι κάτω παύλες μεταξύ ψηφίων αγνοούνται, οπότε τιμές που αντιγράφονται κατευθείαν από κυριολεκτικά ακέραια της Perl αναλύονται καθαρά:
oct("0xDEAD_BEEF") # 3735928559
oct("0b1111_0000") # 240
oct("07_55") # 493
Παραδείγματα#
Αποκωδικοποίηση συμβολοσειράς δικαιωμάτων που πληκτρολόγησε ο χρήστης - ο πλήρης λόγος ύπαρξης της oct. Η συμβολοσειρά "755" δεν είναι ο αριθμός 755· είναι η οκταδική αναπαράσταση του αριθμού 493. Η chmod αναμένει τον αριθμό:
my $mode = "0755";
chmod oct($mode), "script.sh"; # chmod 0755
my $mode = "755"; # no leading zero - still octal
chmod oct($mode), "script.sh"; # same result
Ανάλυση δεκαεξαδικών και δυαδικών κυριολεκτικών διαβασμένων από αρχείο ρυθμίσεων ή γραμμή εντολών:
my $mask = oct("0xff00"); # 65280
my $flags = oct("0b1010_0101"); # 165
Χειρισμός αυθαίρετων συμβολοσειρών με πρόθεμα βάσης - δεκαδικών, οκταδικών, δεκαεξαδικών ή δυαδικών - σε μία έκφραση. Αυτό είναι το κλασικό ιδίωμα oct-ως-διανομέα: ένα αρχικό 0 (σε οποιαδήποτε από τις μορφές του) σημαίνει «όχι δεκαδικό», οπότε δρομολογήστε μέσω της oct· αλλιώς κρατήστε την τιμή ως έχει:
my $n = $val =~ /^0/ ? oct($val) : $val;
Η μορφή με προεπιλεγμένο όρισμα λειτουργεί στην $_, βολική μέσα σε map:
my @perms = map { oct } @mode_strings;
Στρογγυλό ταξίδι με sprintf για να πάτε προς την άλλη κατεύθυνση:
my $perm = (stat $file)[2] & 07777;
my $text = sprintf "%o", $perm; # e.g. "644"
my $back = oct($text); # back to the same integer
Οριακές περιπτώσεις#
Κενή ή undef είσοδος: τα
oct("")καιoct(undef)επιστρέφουν αμφότερα0. Ηundefπυροδοτεί προειδοποίησηuninitializedυπόuse warnings.Καμία πρόθεση εξαρχής σε οκταδικό: η
oct("12")είναι10, όχι12. Αυτή είναι συχνή έκπληξη - αν οι συμβολοσειρές σας μπορεί να είναι δεκαδικές, ελέγξτε πρώτα για αρχικό0(δείτε το ιδίωμα παραπάνω) ή μη χρησιμοποιήσετε καθόλου τηνoctκαι αναλύστε ρητά.Οι κάτω παύλες αγνοούνται όπου κι αν εμφανίζονται μεταξύ ψηφίων. Η
oct("0x_de_ad")είναι57005. Αρχικές και τελικές κάτω παύλες γίνονται επίσης σιωπηρά αποδεκτές.Άκυροι χαρακτήρες τερματίζουν την ανάλυση: η ανάλυση σταματά στον πρώτο χαρακτήρα που δεν ανήκει στην επιλεγμένη βάση· το υπόλοιπο της συμβολοσειράς απορρίπτεται χωρίς προειδοποίηση. Η
oct("0x1g2")επιστρέφει1, ηoct("755.5")επιστρέφει493, ηoct("12abc")επιστρέφει10(οκταδικό, σταμάτησε στοa), ηoct("0b102")επιστρέφει2(δυαδικό10, σταμάτησε στο2).Οι αρχικοί λευκοί χαρακτήρες παραλείπονται σιωπηρά. Αρχικό
+ή-δεν είναι πρόσημο - είναι μη-ψηφίο, οπότε η ανάλυση επιστρέφει0. Ηoctδεν μπορεί να παραγάγει αρνητικό αριθμό.Η κινητή υποδιαστολή και η εκθετική σημειογραφία δεν γίνονται κατανοητές. Δεν υπάρχει υποστήριξη
0x1.8p3· η.τερματίζει την ανάλυση.Τα πεζά/κεφαλαία προθέματος και ψηφίων δεν έχουν σημασία: τα
0X,0B,0O, και δεκαεξαδικά ψηφίαa-f/A-Fγίνονται όλα δεκτά.Υπερχείλιση: τιμές μεγαλύτερες από τον ακέραιο της πλατφόρμας προάγονται σιωπηρά σε κινητή υποδιαστολή, χάνοντας ακρίβεια χαμηλής τάξης για πολύ μεγάλες δεκαεξαδικές/δυαδικές εισόδους.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
hex- εξαναγκάζει βάση 16 ανεξάρτητα από το πρόθεμα· χρησιμοποιήστε την όταν η είσοδος είναι πάντα δεκαεξαδική και δεν θέλετε την αυτόματη ανίχνευση τηςoctint- αποκοπή αριθμητικής τιμής προς το μηδέν· άσχετη με την ανάλυση βάσης αλλά συχνά χρησιμοποιείται κατά λάθοςchmod- ο κανονικός καταναλωτής τηςoct· δέχεται αριθμητικό mode, οπότε modes σε συμβολοσειριακή μορφή πρέπει να περάσουν πρώτα από τηνoctsprintf- η αντίστροφη κατεύθυνση: τα format%o,%x,%bμετατρέπουν έναν ακέραιο στην οκταδική/δεκαεξαδική/δυαδική του συμβολοσειριακή μορφή