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'(ή bundleuse 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- μετατρέπει συμβολοσειρά σε κεφαλαία· ίδια προειδοποίηση με τηνlclcfirst- μετατρέπει σε πεζά μόνο τον πρώτο χαρακτήραucfirst- μετατρέπει σε κεφαλαία μόνο τον πρώτο χαρακτήραindex- αναζήτηση υποσυμβολοσειράς· συνδυάστε μεfcκαι στα δύο τελούμενα για μια παραλλαγή χωρίς διάκριση πεζών-κεφαλαίων$_- το προεπιλεγμένο όρισμα όταν ηEXPRπαραλείπεται