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 είσοδο