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

lc#

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

Η lc παίρνει μια συμβολοσειρά, μετατρέπει κάθε χαρακτήρα με διάκριση πεζών-κεφαλαίων στο πεζό ισοδύναμό του και επιστρέφει το αποτέλεσμα. Το πρωτότυπο δεν τροποποιείται ποτέ. Αν παραλειφθεί το όρισμα, η lc λειτουργεί στην $_. Το ακριβές σύνολο χαρακτήρων που αλλάζει εξαρτάται από την κωδικοποίηση της συμβολοσειράς και τις pragmas που είναι σε εμβέλεια στο σημείο κλήσης - μόνο ASCII εξ ορισμού, πλήρες Unicode υπό use feature 'unicode_strings' ή όταν η είσοδος είναι ήδη συμβολοσειρά χαρακτήρων με τη σημαία UTF-8.

Σύνοψη#

lc EXPR
lc

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

Μια νέα συμβολοσειρά. Η τιμή επιστροφής είναι πάντα ένα καινούργιο βαθμωτό - η τροποποίησή της δεν επηρεάζει το όρισμα, και η εκ των υστέρων τροποποίηση του ορίσματος δεν επηρεάζει την επιστρεφόμενη συμβολοσειρά. Το μήκος σε χαρακτήρες διατηρείται: η lc ποτέ δεν προσθέτει ή αφαιρεί χαρακτήρες, ακόμη και στις σπάνιες περιπτώσεις Unicode όπου οι μορφές πεζών και κεφαλαίων έχουν διαφορετικά μήκη σε άλλες κατευθύνσεις (βλ. fc για casefold, που μπορεί να αλλάξει το μήκος).

my $str = lc("Perl is GREAT");   # "perl is great"

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

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

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

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

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

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

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

  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 ορισμένη - κανόνες Unicode εφαρμόζονται σε κάθε χαρακτήρα.

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

  5. Διαφορετικά - κανόνες ASCII. Χαρακτήρες εκτός των A-Z επιστρέφονται αμετάβλητοι, συμπεριλαμβανομένων κεφαλαίων γραμμάτων Latin-1 όπως τα À-Þ.

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

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

Βασική μετατροπή ASCII σε πεζά:

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

Προεπιλογή στην $_:

for ("FOO", "Bar", "BAZ") {
    print lc, "\n";                 # foo / bar / baz
}

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

use feature 'unicode_strings';
my $s = lc("ÄÖÜ");                  # "äöü"

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

my $bytes = "\xC4\xD6\xDC";         # Ä Ö Ü as Latin-1 bytes
my $lower = lc $bytes;              # unchanged: "\xC4\xD6\xDC"

Η lc είναι αυτή που υποστηρίζει την ακολουθία διαφυγής \L...\E μέσα σε συμβολοσειρές με διπλά εισαγωγικά:

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

Σύγκριση χωρίς διάκριση πεζών-κεφαλαίων με μετατροπή και των δύο πλευρών σε πεζά:

sub ieq { lc($_[0]) eq lc($_[1]) }
ieq("Perl", "PERL");                # true

Για σωστή σύγκριση χωρίς διάκριση πεζών-κεφαλαίων σε όλο το Unicode, προτιμήστε την fc (τη συνάρτηση casefold του Unicode) έναντι της lc - βλ. Δείτε επίσης.

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

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

  • Κενή συμβολοσειρά επιστρέφει την κενή συμβολοσειρά.

  • Οι αριθμοί μετατρέπονται πρώτα σε συμβολοσειρά: η lc(42) επιστρέφει "42".

  • Το LATIN CAPITAL LETTER SHARP S (U+1E9E) μετατρέπεται σε πεζό U+00DF (ß) υπό κανόνες Unicode, αλλά μόνο αν το αποτέλεσμα μπορεί να αναπαρασταθεί χωρίς να διασχιστεί το όριο 255/256 με τρόπο που αποδέχεται το τρέχον σύνολο κανόνων. Υπό use locale σε μη-UTF-8 locale, η Perl αφήνει τον χαρακτήρα αμετάβλητο αντί να μαντέψει - και από την Perl 5.22 και μετά αυτό εγείρει προειδοποίηση locale.

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

  • Tied μεταβλητές καλούν την FETCH μία φορά. Η lc δεν τροποποιεί την tied τιμή· επιστρέφει ένα απλό (μη-tied) βαθμωτό.

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

    my @lower = map { lc } @words;
    

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

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

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

  • uc - το αντίστροφο που μετατρέπει σε κεφαλαία, με τους ίδιους κανόνες pragma και locale

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

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

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

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

  • use feature 'unicode_strings' - επιβάλλει πλήρη σημασιολογία πεζών-κεφαλαίων Unicode ανεξάρτητα από τη σημαία UTF-8 της εισόδου