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

ucfirst#

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

Η ucfirst παίρνει μια συμβολοσειρά, μετατρέπει τον πρώτο της χαρακτήρα στη μορφή titlecase του Unicode, και επιστρέφει το αποτέλεσμα. Κάθε άλλος χαρακτήρας αφήνεται ανέγγιχτος. Το αρχικό δεν τροποποιείται ποτέ. Αν το όρισμα παραλειφθεί, η ucfirst λειτουργεί επί της $_. Το titlecase συνήθως συμπίπτει με το uppercase - το "a" γίνεται "A" - αλλά διαφέρει για μικρό αριθμό δίψηφων (digraphs) σε γραφές που διακρίνουν τα δύο (δείτε Οριακές περιπτώσεις). Οι ίδιοι κανόνες pragma, locale και σημαίας UTF-8 που διέπουν τις lc και uc διέπουν και την ucfirst.

Σύνοψη#

ucfirst EXPR
ucfirst

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

Μια νέα συμβολοσειρά ίδιου μήκους σε χαρακτήρες με την είσοδο - αλλάζει μόνο ο πρώτος χαρακτήρας. Η τιμή επιστροφής είναι πάντοτε φρέσκο βαθμωτό· η τροποποίησή της δεν επηρεάζει το όρισμα, και η τροποποίηση του ορίσματος εκ των υστέρων δεν επηρεάζει την επιστρεφόμενη συμβολοσειρά. Το μήκος σε bytes μπορεί να αλλάξει κατά μερικά bytes αν η μορφή titlecase του πρώτου χαρακτήρα έχει διαφορετική κωδικοποίηση UTF-8 από την αρχική της μορφή.

my $str = ucfirst("hello world!");   # "Hello world!"

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

  • Διαβάζει την $_ όταν καλείται χωρίς όρισμα.

  • Τηρεί το use locale για το LC_CTYPE - όταν ισχύει το locale, ο πίνακας uppercasing του τρέχοντος locale εφαρμόζεται σε πρώτο χαρακτήρα του οποίου το σημείο κώδικα είναι κάτω από 256.

  • Τηρεί το use bytes - υπό use bytes αλλάζει μόνο ένα προπορευόμενο a-z, σε A-Z.

  • Τηρεί το use feature 'unicode_strings' - επιβάλλει κανόνες Unicode ανεξάρτητα από τη σημαία UTF-8 στην είσοδο.

Ποιοι κανόνες πεζών-κεφαλαίων εφαρμόζονται#

Η ucfirst επιλέγει ένα από πέντε σύνολα κανόνων για τον πρώτο χαρακτήρα, με σειρά προτεραιότητας. Νικά αυτό του οποίου η συνθήκη ισχύει πρώτη. Οι μετέπειτα χαρακτήρες περνούν πάντοτε αμετάβλητοι, ανεξάρτητα από το ποιο σύνολο κανόνων εφαρμόστηκε στον πρώτο.

  1. Σε ισχύ το use bytes - κανόνες ASCII. Ένα προπορευόμενο a-z αντιστοιχίζεται σε A-Z· κάθε άλλο προπορευόμενο byte αφήνεται ως έχει, περιλαμβανομένων bytes στο εύρος 128-255 που διαφορετικά θα ήταν γράμματα Latin-1.

  2. Σε ισχύ το use locale για το LC_CTYPE - οι πίνακες του τρέχοντος locale εφαρμόζονται σε πρώτο χαρακτήρα κάτω από το σημείο κώδικα 256· πρώτος χαρακτήρας στο 256 ή πάνω (προσβάσιμος μόνο όταν η συμβολοσειρά φέρει ήδη τη σημαία UTF-8) χρησιμοποιεί κανόνες Unicode. Από την Perl 5.20 και ύστερα, ένα UTF-8 locale χρησιμοποιεί πλήρως κανόνες Unicode καθ” όλη τη διαδρομή.

  3. Το όρισμα έχει τη σημαία UTF-8 ορισμένη - οι κανόνες titlecase του Unicode εφαρμόζονται στον πρώτο χαρακτήρα.

  4. Σε ισχύ το use feature 'unicode_strings' ή το use locale ':not_characters' - οι κανόνες titlecase του Unicode εφαρμόζονται στον πρώτο χαρακτήρα, ανεξάρτητα από τη σημαία UTF-8.

  5. Διαφορετικά - κανόνες ASCII. Προπορευόμενος χαρακτήρας εκτός a-z επιστρέφεται αμετάβλητος, περιλαμβανομένων πεζών γραμμάτων Latin-1 όπως à-þ.

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

Titlecase έναντι uppercase#

Για τη συντριπτική πλειονότητα των χαρακτήρων, το titlecase και το uppercase είναι το ίδιο σημείο κώδικα - το ucfirst("abc") και το uc(substr("abc", 0, 1)) . substr("abc", 1) παράγουν ταυτόσημα αποτελέσματα. Διαφέρουν μόνο για μια χούφτα χαρακτήρες Unicode των οποίων η μορφή uppercase είναι ακολουθία δύο κεφαλαίων γραμμάτων αλλά η μορφή titlecase είναι ένα μοναδικό κεφαλαίο ακολουθούμενο από πεζό. Το τυπικό παράδειγμα είναι το λατινικό δίψηφο dz (U+01F3):

  • το uppercase είναι DZ (U+01F1) - το "DZ" αποδιδόμενο ως ένα κεφαλαίο γλυφικό.

  • το titlecase είναι Dz (U+01F2) - "Dz", κεφαλαίο D ακολουθούμενο από μικρό z.

Η ucfirst επιστρέφει titlecase, που είναι η σωστή μορφή όταν ο χαρακτήρας στέκεται στην αρχή κεφαλαιοποιημένης λέξης. Η uc στον ίδιο πρώτο χαρακτήρα θα επέστρεφε τη μορφή δύο κεφαλαίων, η οποία διαβάζεται σαν να ήταν ολόκληρη η λέξη με κεφαλαία.

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

Βασική μετατροπή πρώτου χαρακτήρα σε κεφαλαίο σε ASCII:

my $s = ucfirst("hello, world!");     # "Hello, world!"

Εξ ορισμού επί της $_:

for ("foo", "bar", "baz") {
    print ucfirst, "\n";              # Foo / Bar / Baz
}

Οι χαρακτήρες Unicode μετατρέπονται σε titlecase μόνο όταν το επιτρέπουν οι κανόνες:

use feature 'unicode_strings';
my $s = ucfirst("äpfel");             # "Äpfel"

Χωρίς το unicode_strings και χωρίς τη σημαία UTF-8 στην είσοδο, ένας μη-ASCII πρώτος χαρακτήρας περνά αμετάβλητος:

my $bytes = "\xE4pfel";               # ä as a single Latin-1 byte
my $cap   = ucfirst $bytes;           # unchanged: "\xE4pfel"

Η ucfirst είναι αυτό που υποστηρίζει τη διαφυγή \u μέσα σε συμβολοσειρές με διπλά εισαγωγικά:

my $str = "\uperl\E is great";        # "Perl is great"

Κεφαλαιοποιήστε κάθε λέξη - συνδυάστε με τις split, map και join:

my $title = join " ", map { ucfirst lc $_ } split / /, "HELLO world";
# "Hello World"

Μετατροπή σε titlecase ενός δίψηφου που διακρίνει το titlecase από το uppercase:

use feature 'unicode_strings';
my $t = ucfirst("\x{01F3}xyz");        # "\x{01F2}xyz" - Dz, not DZ

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

  • Όρισμα undef εγείρει προειδοποίηση uninitialized υπό use warnings και επιστρέφει την κενή συμβολοσειρά.

  • Κενή συμβολοσειρά επιστρέφει την κενή συμβολοσειρά - δεν υπάρχει πρώτος χαρακτήρας για αλλαγή.

  • Συμβολοσειρά ενός χαρακτήρα συμπεριφέρεται ακριβώς όπως θα συμπεριφερόταν η uc για εκείνον τον ένα χαρακτήρα υπό το ίδιο σύνολο κανόνων, εκτός από τις περιπτώσεις δίψηφων που περιγράφονται παραπάνω όπου titlecase και uppercase διαφέρουν.

  • Οι αριθμοί μετατρέπονται πρώτα σε συμβολοσειρά: η ucfirst(42) επιστρέφει "42" - το προπορευόμενο "4" δεν είναι χαρακτήρας με πεζά/κεφαλαία, οπότε δεν αλλάζει τίποτα.

  • Οι προπορευόμενοι λευκοί χαρακτήρες ή σημεία στίξης δεν παραλείπονται. Η ucfirst(" hello") επιστρέφει " hello" - ο πρώτος χαρακτήρας είναι το κενό, που δεν έχει μορφή titlecase. Αν χρειάζεται να κεφαλαιοποιήσετε το πρώτο γράμμα, αφαιρέστε πρώτα τους προπορευόμενους μη-γράμματα χαρακτήρες ή χρησιμοποιήστε regex (s/\b(\w)/\u$1/).

  • Το LATIN SMALL LETTER SHARP S (U+00DF, ß) μετατρέπεται σε titlecase σε "Ss" υπό πλήρεις κανόνες Unicode - αλλαγή μήκους που αντιφάσκει με τη συνηθισμένη εγγύηση «ίδιο μήκος σε χαρακτήρες». Υπό use locale σε μη-UTF-8 locale, η Perl αφήνει τον χαρακτήρα αμετάβλητο αντί να μαντέψει, και από την Perl 5.22 και ύστερα αυτό εγείρει προειδοποίηση locale.

  • Το locale και η σημαία UTF-8 αλληλεπιδρούν: υπό use locale σε μη-UTF-8 locale, ένας πρώτος χαρακτήρας κάτω από το 256 ακολουθεί το locale ενώ ένας πρώτος χαρακτήρας 256 ή πάνω ακολουθεί το Unicode. Στην πράξη η ucfirst αγγίζει πάντοτε μόνο έναν χαρακτήρα, οπότε η αλληλεπίδραση είναι λεπτότερη από ό,τι στις lc / uc, αλλά εξακολουθεί να είναι παρατηρήσιμη σε συμβολοσειρές που ξεκινούν με χαρακτήρες συμπληρωματικού επιπέδου.

  • Οι μεταβλητές με tie δέχονται την κλήση του FETCH τους μία φορά. Η ucfirst δεν τροποποιεί την τιμή με tie· επιστρέφει απλό (χωρίς tie) βαθμωτό.

  • Η ucfirst είναι μοναδιαίος ονομασμένος τελεστής, όχι τελεστής λίστας. Η ucfirst $a, $b αναλύεται ως (ucfirst $a), $b - μετασχηματίζεται μόνο η $a, και ο τελεστής κόμμα απορρίπτει το αποτέλεσμα. Χρησιμοποιήστε παρενθέσεις ή map όταν εννοείτε να μετατρέψετε σε titlecase πολλαπλές συμβολοσειρές:

    my @capped = map { ucfirst } @words;
    

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

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

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

  • lcfirst - το αντίστοιχο για πεζά· μετατρέπει τον πρώτο χαρακτήρα στην πεζή του μορφή

  • uc - μετατρέπει σε κεφαλαία κάθε χαρακτήρα της συμβολοσειράς· χρησιμοποιήστε όταν θέλετε όλη τη συμβολοσειρά κεφαλαιοποιημένη, όχι μόνο το πρώτο γράμμα

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

  • $_ - το προεπιλεγμένο υποκείμενο που διαβάζει η ucfirst όταν καλείται χωρίς όρισμα

  • use locale - ελέγχει αν εφαρμόζονται οι πίνακες locale ή οι κανόνες ASCII/Unicode στον πρώτο χαρακτήρα όταν αυτός είναι κάτω από το σημείο κώδικα 256

  • use feature 'unicode_strings' - επιβάλλει πλήρη titlecasing Unicode ανεξάρτητα από τη σημαία UTF-8 στην είσοδο