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

y///#

Μεταγραμματίζει χαρακτήρες σε μια συμβολοσειρά. Το y/// είναι συνώνυμο του tr/// - τα δύο είναι πανομοιότυπα από κάθε άποψη.

Η γραφή y παρέχεται για τους πιστούς του sed, η μυϊκή μνήμη των οποίων παράγει y/abc/ABC/ αντί για tr/abc/ABC/. Ο αναλυτής της Perl δέχεται οποιοδήποτε από τα δύο· η op που προκύπτει είναι η ίδια. Χρησιμοποιήστε όποια γραφή διαβάζεται καλύτερα στον περιβάλλοντα κώδικα - αν το αρχείο ήδη παραθέτει ένα script sed, το y/// συχνά ταιριάζει· σε νέο Perl, το tr/// είναι πιο συνηθισμένο.

Σύνοψη#

y/SEARCHLIST/REPLACEMENTLIST/cdsr
$var =~ y/SEARCHLIST/REPLACEMENTLIST/cdsr
y/SEARCHLIST/REPLACEMENTLIST/      # transliterates $_

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

Ίδιο με το tr///:

  • Χωρίς /r: ο αριθμός των χαρακτήρων που αντιστοιχίστηκαν (και αντικαταστάθηκαν ή διαγράφηκαν), αφού ο στόχος τροποποιηθεί επιτόπου.

  • Με /r: μια νέα συμβολοσειρά με τον μεταγραμματισμό εφαρμοσμένο· το πρωτότυπο μένει ανέγγιχτο.

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

Κλασικός μεταγραμματισμός κεφαλαίων στυλ sed στο $_:

while (<>) {
    y/a-z/A-Z/;
    print;
}

Μέτρηση φωνηέντων χωρίς τροποποίηση της συμβολοσειράς, με χρήση του /r για απόρριψη του μεταγραμματισμένου αντιγράφου:

my $vowels = ($text =~ y/aeiouAEIOU//) ;   # count in place is fine too
my $count  = () = $text =~ /[aeiouAEIOU]/g;

Αφαιρέστε τα πάντα εκτός από τα ψηφία από μια συμβολοσειρά (μη καταστροφικό αντίγραφο μέσω /r, complement + delete):

my $digits = $phone =~ y/0-9//cdr;         # "(415) 555-1212" → "4155551212"

Rot13 - το σχολικό μονογραμμικό y///:

(my $coded = $plain) =~ y/A-Za-z/N-ZA-Mn-za-m/;

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

Δείτε tr/// για την πλήρη λίστα. Δύο αξίζει να επαναληφθούν εδώ:

  • Καμία παρεμβολή μεταβλητών. Το y/$x/$y/ μεταγραμματίζει τους κυριολεκτικούς χαρακτήρες $, x έναντι των $, y - όχι το περιεχόμενο αυτών των μεταβλητών. Αυτό ταιριάζει με το tr/// και είναι το πιο συνηθισμένο bug μετάφρασης από sed σε Perl.

  • Το y'...'...' απενεργοποιεί τις περιοχές. Με μονοί-εισαγωγικοί οριοθέτες, το - είναι κυριολεκτικό: το y'a-z'A-Z' μεταγραμματίζει μόνο τα a, -, z έναντι των A, -, Z.

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

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

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

  • tr/// - η κανονική γραφή· πανομοιότυπη σημασιολογία, ίδιες σημαίες (/c, /d, /s, /r), ίδιες οριακές περιπτώσεις

  • s/// - αντικατάσταση βασισμένη σε μοτίβο όταν η αντιστοίχιση χαρακτήρα-προς-χαρακτήρα δεν αρκεί

  • lc, uc - αλλαγή πεζών/κεφαλαίων με επίγνωση locale και Unicode· προτιμήστε αυτά έναντι του y/a-z/A-Z/ για οτιδήποτε πέρα από ASCII

  • $_ - ο προεπιλεγμένος στόχος όταν δεν δίνεται δέσμευση =~