Βαθμωτά και συμβολοσειρές

uc#

Επιστροφή κεφαλαιοποιημένου αντιγράφου μιας συμβολοσειράς.

Η uc διασχίζει την EXPR χαρακτήρα-χαρακτήρα και επιστρέφει νέα συμβολοσειρά στην οποία κάθε χαρακτήρας με πεζά/κεφαλαία έχει αντικατασταθεί από το κεφαλαίο αντίστοιχό του. Χαρακτήρες που δεν έχουν αντιστοίχιση κεφαλαίου - ψηφία, σημεία στίξης, ήδη κεφαλαία γράμματα, σύμβολα - περνούν αμετάβλητοι. Αν η EXPR παραλειφθεί, η uc λειτουργεί στην $_. Η είσοδος δεν τροποποιείται ποτέ· η uc επιστρέφει πάντα νέα συμβολοσειρά.

Η uc είναι η εσωτερική συνάρτηση που υλοποιεί τη διαφυγή \U σε συμβολοσειρές με διπλά εισαγωγικά, οπότε τα "\Ufoo\E" και uc("foo") παράγουν το ίδιο αποτέλεσμα.

Σύνοψη#

uc EXPR
uc

Τι επιστρέφεται#

Μια νέα βαθμωτή συμβολοσειρά που περιέχει την κεφαλαιοποιημένη εκδοχή της EXPR. Το μήκος σε χαρακτήρες είναι αμετάβλητο για όλα τα γράμματα με πεζά/κεφαλαία στο Basic Multilingual Plane· λίγοι χαρακτήρες αναπτύσσονται σε μακρύτερη μορφή υπό τους κανόνες Unicode (δείτε Οριακές περιπτώσεις), οπότε το μήκος σε bytes και το μήκος σε χαρακτήρες του αποτελέσματος μπορούν να αυξηθούν αμφότερα.

my $s = uc("Perl is GREAT");   # "PERL IS GREAT"

Καθολική κατάσταση που επηρεάζει#

  • $_ - χρησιμοποιείται ως έμμεσο όρισμα όταν παραλείπεται η EXPR.

  • Η τοπικιοποίηση LC_CTYPE - συμβουλεύεται όταν το use locale είναι ενεργό. Η uc αλλιώς αγνοεί το περιβάλλον.

  • Τα use bytes / use feature 'unicode_strings' / use locale - τα λεξιλογικά pragmas στην εμβέλεια στο σημείο κλήσης επιλέγουν ποιο από τα παρακάτω σύνολα κανόνων πεζών/κεφαλαίων εφαρμόζεται.

Ποιοι κανόνες ισχύουν#

Η uc επιλέγει ένα από τρία σύνολα κανόνων με βάση τα pragmas που ισχύουν και την εσωτερική αναπαράσταση της συμβολοσειράς. Η λογική ταιριάζει ακριβώς με την lc· ο πίνακας αντιστοίχισης είναι απλώς αντίστροφος.

  • Το use bytes ισχύει - κανόνες ASCII. Αλλάζουν μόνο τα a-z, σε A-Z αντίστοιχα. Κάθε byte εκτός του 0x61..0x7A περνά αμετάβλητο, ανεξάρτητα από το τι θα σήμαινε ως Latin-1 ή UTF-8. Χρησιμοποιήστε το μόνο όταν έχετε σκόπιμα δηλώσει αποχώρηση από τον χειρισμό Unicode.

  • Το use locale για το LC_CTYPE ισχύει - η τρέχουσα τοπικιοποίηση διέπει τα code points κάτω από 256· οι κανόνες Unicode διέπουν τα υπόλοιπα (τα τελευταία προσβάσιμα μόνο αν η συμβολοσειρά έχει ορισμένη τη σημαία UTF-8). Από την v5.20 και μετά, μια τοπικιοποίηση UTF-8 δίνει πλήρεις κανόνες Unicode για ολόκληρη τη συμβολοσειρά. Υπό μη-UTF-8 τοπικιοποιήσεις, αλλαγές πεζών/κεφαλαίων που διασχίζουν το όριο 255/256 δεν είναι καλά ορισμένες και, από την v5.22, πυροδοτούν προειδοποίηση τοπικιοποίησης. Δείτε το perllocale.

  • Η συμβολοσειρά έχει ορισμένη τη σημαία UTF-8 - κανόνες Unicode.

  • Το use feature 'unicode_strings' ή το use locale ':not_characters' ισχύει - κανόνες Unicode, ακόμη και για συμβολοσειρές bytes.

  • Αλλιώς - κανόνες ASCII. Οτιδήποτε εκτός του a-z περνά αμετάβλητο. Αυτή είναι η ιστορική προεπιλογή για συμβολοσειρές που δεν έχουν ούτε τη σημαία UTF-8 ούτε λεξιλογικό pragma για συμμετοχή στο Unicode.

Το πρακτικό συμπέρασμα: αν θέλετε προβλέψιμη κεφαλαιοποίηση Unicode αυθαίρετης εισόδου, βάλτε use feature 'unicode_strings'; (ή μια σύγχρονη use v5.12; ή ανώτερη) στην κορυφή του αρχείου και πάψτε να ανησυχείτε για το ποια αναπαράσταση τυχαίνει να έχει η συμβολοσειρά.

Παραδείγματα#

Βασικό ASCII:

my $s = uc("hello");           # "HELLO"

Όρισμα που παραλείπεται λειτουργεί στην $_:

for ("alpha", "beta") {
    print uc, "\n";            # "ALPHA\n", "BETA\n"
}

Το \U σε συμβολοσειρά με διπλά εισαγωγικά είναι η ίδια λειτουργία:

my $s = "Perl is \Ugreat\E";   # "Perl is GREAT"

Κεφαλαιοποίηση Unicode υπό unicode_strings:

use feature 'unicode_strings';
my $s = uc("straße");          # "STRASSE"

Το γερμανικό sharp s δεν έχει μονοχαρακτηρικό κεφαλαίο στο Unicode· αντιστοιχίζεται στη διχαρακτηρική ακολουθία SS. Η επιστρεφόμενη συμβολοσειρά είναι ως εκ τούτου ένας χαρακτήρας μακρύτερη από την είσοδο.

Τα ελληνικά πεζά γράμματα κεφαλαιοποιούνται σε κεφαλαία, με τους αμετάβλητους χαρακτήρες να περνούν:

use feature 'unicode_strings';
my $s = uc("Καλημέρα, world!"); # "ΚΑΛΗΜΈΡΑ, WORLD!"

Η λειτουργία byte περιορίζει τη λειτουργία στο ASCII, κάτι που περιστασιακά είναι το επιθυμητό για tokens πρωτοκόλλων:

use bytes;
my $s = uc("héllo");           # "HéLLO" - only the ASCII letters change

Οριακές περιπτώσεις#

  • undef: η uc(undef) επιστρέφει "" και πυροδοτεί προειδοποίηση uninitialized υπό use warnings. Προστατέψτε εισόδους που μπορεί να είναι undefined αν αυτή η προειδοποίηση έχει σημασία.

  • Κενή συμβολοσειρά: η uc("") επιστρέφει "". Καμία προειδοποίηση.

  • Αντιστοιχίσεις ένα-προς-πολλά: Μικρός αριθμός χαρακτήρων αναπτύσσεται σε πολλαπλούς χαρακτήρες σε κεφαλαία - η πιο γνωστή είναι U+00DF (ß) → SS, και οι ελληνικές αναπτύξεις U+0390 / U+03B0. Η συμβολοσειρά αποτελέσματος είναι μακρύτερη από την είσοδο σε αυτές τις περιπτώσεις. Μην υποθέτετε length(uc($s)) == length($s).

  • Titlecase έναντι uppercase: η uc δεν εφαρμόζει titlecase στο πρώτο γράμμα. Το titlecase είναι διακριτή κατηγορία Unicode· η ucfirst το εφαρμόζει στον πρώτο χαρακτήρα και αφήνει τα υπόλοιπα ως έχουν.

  • Χαρακτήρες χωρίς πεζά/κεφαλαία: Ψηφία, σημεία στίξης, λευκοί χαρακτήρες, σύμβολα και ιδεογράμματα CJK επιστρέφονται αμετάβλητα. Η uc("42!") είναι "42!".

  • Η επιτόπια ενημέρωση δεν υπάρχει: η uc επιστρέφει νέα τιμή· δεν τροποποιεί ποτέ το όρισμά της. Για κεφαλαιοποίηση επιτόπου, εκχωρήστε πίσω: $s = uc $s.

  • Περιβάλλον: η uc είναι πάντα βαθμωτή. Η κλήση της σε περιβάλλον λίστας παράγει παρ” όλα αυτά μία μόνο συμβολοσειρά.

  • Εκπλήξεις συμβολοσειράς bytes / σημαίας Unicode: Συμβολοσειρά κατασκευασμένη από read χωρίς layer :utf8 δεν έχει σημαία UTF-8, οπότε η uc χωρίς use feature 'unicode_strings' θα εφαρμόσει κανόνες ASCII ακόμη και αν τα bytes είναι έγκυρο UTF-8. Αποκωδικοποιήστε πρώτα, ή ενεργοποιήστε το pragma, για να πάρετε την κεφαλαιοποίηση που φαίνεται ότι θα έπρεπε να πάρουν τα bytes.

  • Το use locale και μη-UTF-8 τοπικιοποιήσεις (v5.22+): Αλλαγές πεζών/κεφαλαίων που θα διέσχιζαν το όριο 255/256 εκπέμπουν προειδοποίηση Can't do uc("…") on non-UTF-8 locale και επιστρέφουν τον χαρακτήρα εισόδου αμετάβλητο.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • lc - η αντίστροφη λειτουργία· μετατρέπει σε πεζά κάθε χαρακτήρα με πεζά/κεφαλαία χρησιμοποιώντας την ίδια επιλογή κανόνων

  • ucfirst - κεφαλαιοποιεί (titlecase) μόνο τον πρώτο χαρακτήρα της συμβολοσειράς· για ένα Unicode-aware μοτίβο ucfirst . lc $rest όταν κάνετε titlecase μια ολόκληρη λέξη

  • lcfirst - μετατρέπει σε πεζό μόνο τον πρώτο χαρακτήρα

  • fc - Unicode casefolding για σύγκριση χωρίς διάκριση πεζών-κεφαλαίων· χρησιμοποιήστε αυτή, όχι την uc ή την lc, όταν συγκρίνετε συμβολοσειρές για ισοδυναμία

  • sprintf - η μετατροπή %s δεν κάνει casefold· συνδυάστε με την uc όταν ένα format χρειάζεται κεφαλαιοποιημένο πεδίο

  • tr/// - το ιδίωμα tr/a-z/A-Z/ κεφαλαιοποιεί μόνο ASCII και είναι ταχύτερο από την uc για εγγυημένα-ASCII είσοδο