Βαθμωτά και συμβολοσειρές · Αριθμητικές συναρτήσεις

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 (μετά από τυχόν αρχικούς λευκούς χαρακτήρες, οι οποίοι παραλείπονται σιωπηρά) καθορίζουν τη βάση:

Πρόθεμα

Βάση

Παράδειγμα εισόδου

Αποτέλεσμα

0x ή x

16 (δεκαεξαδικό)

"0xff"

255

0b ή b

2 (δυαδικό)

"0b1010"

10

0o ή o

8 (οκταδικό)

"0o755"

493

(κανένα)

8 (οκταδικό)

"755"

493

(κανένα, αρχικό 0)

8 (οκταδικό)

"0755"

493

Το οκταδικό πρόθεμα 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 ανεξάρτητα από το πρόθεμα· χρησιμοποιήστε την όταν η είσοδος είναι πάντα δεκαεξαδική και δεν θέλετε την αυτόματη ανίχνευση της oct

  • int - αποκοπή αριθμητικής τιμής προς το μηδέν· άσχετη με την ανάλυση βάσης αλλά συχνά χρησιμοποιείται κατά λάθος

  • chmod - ο κανονικός καταναλωτής της oct· δέχεται αριθμητικό mode, οπότε modes σε συμβολοσειριακή μορφή πρέπει να περάσουν πρώτα από την oct

  • sprintf - η αντίστροφη κατεύθυνση: τα format %o, %x, %b μετατρέπουν έναν ακέραιο στην οκταδική/δεκαεξαδική/δυαδική του συμβολοσειριακή μορφή