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

fc#

Επιστρέφει τη casefold μορφή μιας συμβολοσειράς κατά Unicode για σύγκριση χωρίς διάκριση πεζών-κεφαλαίων.

Η fc είναι η λειτουργία συμβολοσειράς που τροφοδοτεί την ισότητα συμβολοσειρών χωρίς διάκριση πεζών-κεφαλαίων. Παράγει μια μορφή της συμβολοσειράς όπου οι διακρίσεις πεζών-κεφαλαίων έχουν διαγραφεί, οπότε δύο συμβολοσειρές θεωρούνται ίσες χωρίς διάκριση πεζών-κεφαλαίων όταν - και μόνο όταν - τα αποτελέσματα της fc είναι byte προς byte πανομοιότυπα. Είναι επίσης η συνάρτηση πίσω από την ακολουθία διαφυγής \F σε συμβολοσειρές με διπλά εισαγωγικά.

Σύνοψη#

use feature 'fc';           # or: use v5.16;

fc EXPR
fc                          # operates on $_
"\F...\E"                   # same casefold, inside a double-quoted string

Η fc βρίσκεται πίσω από την πύλη του χαρακτηριστικού fc. Ενεργοποιήστε την ρητά με use feature 'fc', ενσωματώστε την μέσω bundle έκδοσης (use v5.16 ή νεότερο, use feature ':5.16'), ή καλέστε την πλήρως κατονομασμένη ως CORE::fc χωρίς καμία pragma.

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

Μια συμβολοσειρά που περιέχει τη casefold μορφή της EXPR. Το αποτέλεσμα είναι μια καινούργια συμβολοσειρά· το όρισμα δεν τροποποιείται ποτέ. Το μήκος μπορεί να αλλάξει - η casefold του "\x{1E9E}" (LATIN CAPITAL LETTER SHARP S) κανονικά επεκτείνεται σε "ss", δύο χαρακτήρες από έναν.

Αντιμετωπίστε την τιμή επιστροφής ως αδιαφανή: είναι κλειδί κατάλληλο για σύγκριση ισότητας, όχι για εμφάνιση. Η fc("Hello") είναι "hello" για ASCII, αλλά στη γενική περίπτωση η έξοδος δεν είναι κάτι που θα δείχνατε σε χρήστη.

Γιατί όχι lc ή uc;#

Η μετατροπή σε πεζά και η μετατροπή σε κεφαλαία δεν είναι αξιόπιστες για σύγκριση χωρίς διάκριση πεζών-κεφαλαίων. Και οι δύο παρακάτω είναι λάθος:

lc($a) eq lc($b)            # Wrong
uc($a) eq uc($b)            # Also wrong

Αποτυγχάνουν σε χαρακτήρες των οποίων η αντιστοίχιση πεζών/κεφαλαίων δεν είναι συμμετρική - με πιο γνωστό παράδειγμα το γερμανικό sharp S. Η lc("\x{1E9E}") είναι "\x{1E9E}" (δεν υπάρχει μορφή πεζών), αλλά η uc("ß") είναι "SS". Η casefold παρακάμπτει αυτό αντιστοιχίζοντας και τις δύο πλευρές σε μια αφιερωμένη μορφή ισότητας:

fc($a) eq fc($b)            # Right

Το βασισμένο σε regex ισοδύναμο που ήταν σωστό πριν υπάρξει η fc:

$a =~ /^\Q$b\E\z/i

Η fc είναι ο άμεσος, χωρίς-regex τρόπος να πάρετε την ίδια απάντηση.

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

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

  • use locale - μέσα σε εμβέλεια use locale, η casefold χαρακτήρων που διασχίζουν το όριο 255/256 απενεργοποιείται (δείτε τις Οριακές περιπτώσεις παρακάτω για τον κανόνα του U+1E9E).

  • use feature 'unicode_strings' - επηρεάζει την fc με τον ίδιο τρόπο όπως επηρεάζει την lc: επιβάλλει πλήρη σημασιολογία Unicode σε συμβολοσειρές bytes που διαφορετικά θα αντιμετωπίζονταν υπό τους παλιούς 8-bit κανόνες.

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

Ισότητα χωρίς διάκριση πεζών-κεφαλαίων, η κανονική χρήση:

use feature 'fc';
fc("Hello") eq fc("HELLO");             # true
fc("café")  eq fc("CAFÉ");              # true

Το γερμανικό sharp S - η σχολικού βιβλίου περίπτωση όπου και η lc και η uc αποτυγχάνουν αλλά η fc πετυχαίνει:

use feature 'fc';
my $a = "straße";
my $b = "STRASSE";
fc($a) eq fc($b);                       # true
lc($a) eq lc($b);                       # false - "straße" ne "strasse"

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

use feature 'fc';
my %seen;
for my $word (@words) {
    $seen{ fc $word }++;                # groups "Foo", "FOO", "foo"
}

Χωρίς όρισμα - λειτουργεί στην $_:

use feature 'fc';
for (@lines) {
    next unless fc eq "quit";           # matches "QUIT", "Quit", ...
    last;
}

Μέσα σε συμβολοσειρά με διπλά εισαγωγικά μέσω της \F (ίδια λειτουργία, ενσωματωμένη):

use feature 'fc';
my $name = "Alice";
my $key  = "\F$name\E";                 # "alice" - same as fc($name)

Κλήση χωρίς την feature pragma, πλήρως κατονομασμένη:

my $folded = CORE::fc($input);          # works in any scope

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

  • Χωρίς όρισμα: η fc χωρίς όρισμα κάνει fold την $_.

  • Όρισμα undef: μετατρέπεται σε συμβολοσειρά ως κενή συμβολοσειρά, που με τη σειρά της κάνει fold στην κενή συμβολοσειρά. Εκπέμπει προειδοποίηση uninitialized υπό use warnings.

  • Το χαρακτηριστικό δεν είναι ενεργοποιημένο: η fc EXPR χωρίς use feature 'fc' (ή bundle use v5.16+) είναι σφάλμα κατά τη μεταγλώττιση - ο αναλυτής δεν αναγνωρίζει την fc ως δεσμευμένη λέξη. Η CORE::fc(EXPR) λειτουργεί πάντα.

  • Το μήκος μπορεί να αλλάξει: οι πλήρεις casefolds μπορούν να επεκτείνουν έναν χαρακτήρα σε πολλούς. Η fc("\x{1E9E}") είναι "ss". Μη βασιστείτε ποτέ στο length(fc $s) == length($s).

  • Δεν είναι πλήρης κύκλος: η fc είναι μονόδρομη. Δεν υπάρχει λειτουργία «uncasefold»· η αρχική κατάσταση πεζών-κεφαλαίων χάθηκε.

  • Το U+1E9E υπό use locale: η fc του LATIN CAPITAL LETTER SHARP S (U+1E9E) κανονικά κάνει fold σε "ss". Υπό use locale αυτή η αντιστοίχιση καταστέλλεται, επειδή διασχίζει το όριο σημείων κώδικα 255/256, που οι κανόνες locale δεν χειρίζονται καθαρά. Αντί αυτού η fc επιστρέφει "\x{17F}\x{17F}" (δύο LATIN SMALL LETTER LONG S). Επειδή κάθε long s κάνει το ίδιο fold σε "s", δύο από αυτά συγκρίνονται ίσα με ένα μεμονωμένο U+1E9E που έκανε fold εκτός της εμβέλειας locale - οπότε η σημασιολογία ισότητας διατηρείται παρότι η μορφή σε bytes διαφέρει.

  • Δεν παρέχονται Turkic και «simple» folds: η Perl υλοποιεί μόνο την πλήρη, μη-Turkic μορφή casefold. Για την απλή μορφή ή τη Turkic παραλλαγή, χρησιμοποιήστε την Unicode::UCD::casefold ή το CPAN άρθρωμα Unicode::Casing.

  • Δεν είναι το ίδιο με NFKC ή NFC: η fc διαγράφει τις διακρίσεις πεζών-κεφαλαίων, όχι διαφορές συμβατότητας. Η fc("ffi") (LATIN SMALL LIGATURE FFI) είναι "ffi" μετά το fold, όχι "ffi". Συνδυάστε με την Unicode::Normalize αν χρειάζεστε και τα δύο.

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

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

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

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

  • uc - μετατρέπει συμβολοσειρά σε κεφαλαία· ίδια προειδοποίηση με την lc

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

  • ucfirst - μετατρέπει σε κεφαλαία μόνο τον πρώτο χαρακτήρα

  • index - αναζήτηση υποσυμβολοσειράς· συνδυάστε με fc και στα δύο τελούμενα για μια παραλλαγή χωρίς διάκριση πεζών-κεφαλαίων

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