qw//#
Δομεί λίστα από barewords κάνοντας split μιας οριοθετημένης συμβολοσειράς σε λευκούς χαρακτήρες, χωρίς εισαγωγικά ή διαχωρισμό με κόμμα σε κάθε λέξη.
Η qw// είναι τελεστής τύπου-εισαγωγικών μεταγλώττισης, όχι συνάρτηση χρόνου εκτέλεσης. Ο αναλυτής βλέπει qw(foo bar baz) και εκπέμπει τη σταθερή λίστα ("foo", "bar", "baz") - δεν συμβαίνει split κατά τον χρόνο εκτέλεσης, και η λίστα συγκροτείται μία φορά ανεξάρτητα από το πόσο συχνά εκτελείται ο κώδικας. Καταφύγετε σε αυτήν όπου διαφορετικά θα γράφατε λίστα από σύντομες, απλές κυριολεκτικές τιμές συμβολοσειρών χωρισμένες με κόμμα: λίστες εισαγωγής, @ISA, @EXPORT, σύνολα κλειδιών hash, πίνακες ονομάτων δοκιμών.
Σύνοψη#
qw(foo bar baz)
qw[foo bar baz]
qw{foo bar baz}
qw<foo bar baz>
qw!foo bar baz!
qw/foo bar baz/
Κάθε μη αλφαριθμητικός χαρακτήρας λειτουργεί ως οριοθέτης. Τα τέσσερα ζεύγη αγκυλών ((), [], {}, <>) εμφωλεύονται· όλοι οι άλλοι οριοθέτες δεν εμφωλεύονται.
Τι επιστρέφεται#
Λίστα συμβολοσειρών σε περιβάλλον λίστας - ένα στοιχείο ανά συνεχόμενη ακολουθία μη λευκών χαρακτήρων στο σώμα, με τα αρχικά και τελικά λευκά να απορρίπτονται και συνεχόμενες ακολουθίες εσωτερικών λευκών να αντιμετωπίζονται ως ένας διαχωριστής.
Σε βαθμωτό περιβάλλον η qw// αποτιμάται στο τελευταίο στοιχείο της λίστας, που σχεδόν ποτέ δεν είναι αυτό που εννοούσε ο συγγραφέας. Το use warnings επισημαίνει τα συνηθισμένα λάθη βαθμωτού περιβάλλοντος (δείτε Οριακές περιπτώσεις).
Παραδείγματα#
Λίστα εισαγωγής για άρθρωμα - η κανονική χρήση:
use POSIX qw(setlocale localeconv strftime);
Πίνακες @EXPORT / @EXPORT_OK / @ISA:
our @ISA = qw(Exporter);
our @EXPORT = qw(sum min max);
Δομήστε ένα μικρό hash όπου κάθε κλειδί αντιστοιχίζεται στο 1 (ένα σύνολο):
my %is_keyword = map { $_ => 1 } qw(if unless while until for);
if ($is_keyword{$word}) { ... }
Σύγκριση των τριών τρόπων γραφής της ίδιας λίστας - με κόμματα και εισαγωγικά, αυτόματα εισαγωγικά με fat-comma, και qw//:
my @a = ("foo", "bar", "baz"); # explicit strings
my @b = (foo => "1", bar => "2", baz => "3"); # fat comma only
my @c = qw(foo bar baz); # qw//
Αρχικοποίηση πίνακα με πολλά σύντομα διακριτικά:
my @months = qw(
Jan Feb Mar Apr May Jun
Jul Aug Sep Oct Nov Dec
);
Λίστα ορισμάτων κατά θέση προς συνάρτηση:
run_tests(qw(smoke integration regression));
Οριακές περιπτώσεις#
Κανένα κόμμα μέσα στο σώμα. Το κόμμα λαμβάνεται ως μέρος λέξης: η
qw(foo, bar)αποδίδει διστοιχειακή λίστα("foo,", "bar"), όχι τριστοιχειακή. Τοuse warningsεκπέμπειPossible attempt to separate words with commas.Καμία σύνταξη σχολίων. Το
#είναι κυριολεκτικός χαρακτήρας μέσα στο σώμα. Ηqw(foo # comment\n bar)περιέχει τη λέξη#και τη λέξηcomment. Τοuse warningsεκπέμπειPossible attempt to put comments in qw() list.Καμία διαφυγή με ανάστροφη κάθετο. Το
\είναι κυριολεκτικό - δεν μπορείτε να διαφύγετε λευκό χαρακτήρα για να τον συμπεριλάβετε σε λέξη, και δεν μπορείτε να κάνετε\-διαφυγή του οριοθέτη. Τοuse warningsεκπέμπει προειδοποίηση για κάθε\στο σώμα.Καμία παρεμβολή. Η
qw($x @y)παράγει τις δύο κυριολεκτικές συμβολοσειρές"$x"και"@y". Χρησιμοποιήστε("$x", @y)(ήq()/qq()) όταν θέλετε την τιμή μιας μεταβλητής.Ο λευκός χαρακτήρας είναι ο μόνος διαχωριστής. Tabs και newlines χωρίζουν τις λέξεις ακριβώς όπως τα κενά, γι” αυτό και οι πολυγραμμικές λίστες
qw(...)είναι ιδιωματικές για μακριούς πίνακες.Λέξεις με ενσωματωμένο λευκό χαρακτήρα είναι αδύνατες. Αν χρειάζεστε το
"hello world"ως μονό στοιχείο, ηqw//είναι λάθος εργαλείο - χρησιμοποιήστε("hello world", ...)με αληθινά εισαγωγικά.Κενό σώμα. Η
qw()είναι η κενή λίστα, ισοδύναμη με().Το βαθμωτό περιβάλλον αποδίδει το τελευταίο στοιχείο, όχι τον αριθμό. Τυλίξτε σε
scalar(() = qw(...))αν θέλετε γνήσια τον αριθμό, ή αναθέστε πρώτα σε πίνακα:my @w = qw(foo bar baz); print scalar @w; # 3
Αμφισημία του αναλυτή με
//. Ηqw//χρησιμοποιεί το/ως οριοθέτη ακριβώς όπως οιm//καιs///. Μέσα στο σώμα, δεν εφαρμόζονται μετα-χαρακτήρες regex - είναι επίπεδη συμβολοσειρά που διαιρείται με λευκούς χαρακτήρες. Η οπτική ομοιότητα με regex είναι κίνδυνος ανάγνωσης, όχι σημασιολογικός.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
q//- κυριολεκτική συμβολοσειρά με μονά εισαγωγικά· χωρίς παρεμβολή, σε αντίθεση με τηνqq//qq//- κυριολεκτική συμβολοσειρά με διπλά εισαγωγικά με πλήρη παρεμβολήqr//- μεταγλωττίζει regex literal· το μέλος της οικογένειας//για αντιστοίχιση μοτίβωνsplit- το αντίστοιχο χρόνου εκτέλεσης όταν η λίστα λέξεών σας δεν είναι γνωστή πριν τον χρόνο εκτέλεσης: ηsplit(" ", $str)συμπεριφέρεται σχεδόν ακριβώς όπως μια δυναμικήqw//join- η αντίστροφη λειτουργία, που κολλάει μια λίστα πίσω σε μία οριοθετημένη συμβολοσειρά