qq//#
Κατασκευάζει μια συμβολοσειρά σε διπλά εισαγωγικά με παρεμβολή, με οριοθέτη της επιλογής σας.
Το qq// είναι η μακρά μορφή του κυριολεκτικού συμβολοσειράς "...". Παράγει την ίδια συμβολοσειρά που θα παρήγαγε το "", οπότε τα qq/hello $name\n/ και "hello $name\n" είναι εναλλάξιμα. Το νόημα του qq είναι ο οριοθέτης: όταν το περιεχόμενο περιέχει " (ή ακολουθίες backslash που θα παρενέβαιναν στα διπλά εισαγωγικά), επιλέγετε διαφορετικό οριοθέτη και διατηρείτε τη συμβολοσειρά αναγνώσιμη αντί να τη γεμίζετε με \".
Σύνοψη#
qq/STRING/
qq{STRING}
qq(STRING)
qq[STRING]
qq<STRING>
qqXSTRINGX # any non-word, non-whitespace char works as delimiter
Τι επιστρέφεται#
Μια βαθμωτή συμβολοσειρά. Οι μεταβλητές που αναφέρονται μέσα παρεμβάλλονται τη στιγμή που αποτιμάται το qq// (όχι κατά την ανάλυση)· οι ακολουθίες διαφυγής με backslash επεκτείνονται. Το αποτέλεσμα δεν έχει υπονοούμενο newline - πρέπει να γράψετε ρητά \n.
Επιλογή οριοθέτη#
Οποιοσδήποτε χαρακτήρας που δεν είναι χαρακτήρας λέξης (/\w/) και δεν είναι λευκός χαρακτήρας μπορεί να ακολουθήσει το qq. Τα τέσσερα ζεύγη αγκυλών εμφωλεύονται:
qq(foo (bar) baz) # "foo (bar) baz" - inner () balanced
qq{ if ($x) { 1 } else { 0 } }
qq[a[b[c]d]e]
qq<<a<b>c>>
Οι οριοθέτες που δεν είναι αγκύλες χρησιμοποιούν τον ίδιο χαρακτήρα και στα δύο άκρα και δεν εμφωλεύονται:
qq|one|two| # SYNTAX ERROR - first | closes
qq/a\/b/ # "a/b" - backslash escapes the delimiter
Αν ο οριοθέτης είναι χαρακτήρας λέξης, απαιτείται λευκός χαρακτήρας μεταξύ του qq και του οριοθέτη:
qq XfooX # OK - "foo"
qqXfooX # WRONG - parsed as identifier qqXfooX
Το # ως οριοθέτης δεν χρειάζεται κενό και είναι περιστασιακά χρήσιμο για συμβολοσειρές που περιέχουν κάθε άλλο σημείο στίξης:
qq#He said "hi" & waved.# # "He said \"hi\" & waved."
Το χαρακτηριστικό extra_paired_delimiters (5.36+) αναγνωρίζει ένα ευρύ σύνολο ζευγών αγκυλών Unicode ως οριοθέτες που εμφωλεύονται· ενεργοποιήστε το με use feature 'extra_paired_delimiters' όταν θέλετε, για παράδειγμα, εισαγωγικά γαλλικού τύπου ή αγκύλες CJK.
Τι παρεμβάλλεται#
Βαθμωτά:
$x,$hash{key},$array[0],$ref->{k}[2].Πίνακες: το
@arrεπεκτείνεται σε σειρά, με τα στοιχεία να ενώνονται από το$"(προεπιλογή" "). Ισοδύναμο μεjoin $", @arr.Τομές:
@h{qw(a b)},@a[1..3].Αποαναφορές με βέλη και δείκτες:
$ref->{key}[0].
Τι δεν παρεμβάλλεται:
Κλήσεις μεθόδων: το
$obj->methμέσα σεqq//παρεμβάλλει την$objκαι αφήνει το κυριολεκτικό κείμενο->methμέσα στη συμβολοσειρά.Κλήσεις συναρτήσεων: η συνηθισμένη παράκαμψη είναι το
@{[ func() ]}- η αποαναφορά πίνακα μέσω αναφοράς εκτελεί αυθαίρετο κώδικα και ενσωματώνει το αποτέλεσμά του.Πίνακες σημείων στίξης εκτός των
@_,@+,@-: παρεμβάλλονται μόνο σε άγκιστρα (@{*}). Το γυμνό@*είναι κυριολεκτικό@*.
my $obj = Some::Class->new;
qq/$obj->name/; # interpolates $obj, leaves "->name"
qq/@{[ $obj->name ]}/; # calls the method, interpolates result
Ακολουθίες διαφυγής#
Διαθέσιμες μέσα σε qq// (και οπουδήποτε αλλού γίνεται παρεμβολή):
Ακολουθία | Σημασία |
|---|---|
| στηλοθέτης (HT) |
| newline (εικονικός τερματιστής γραμμής της πλατφόρμας) |
| επιστροφή φορείου (CR) |
| αλλαγή σελίδας (FF) |
| οπισθοδιαγραφή (BS) |
| συναγερμός / κουδούνι (BEL) |
| διαφυγή (ESC) |
| NUL |
| κυριολεκτικό backslash |
| κυριολεκτικό διπλό εισαγωγικό |
| δεκαεξαδικός χαρακτήρας, 0x00–0xFF |
| δεκαεξαδικός χαρακτήρας, οποιοδήποτε σημείο κώδικα (μορφή με άγκιστρα) |
| οκταδικός χαρακτήρας, οποιοδήποτε σημείο κώδικα |
| οκταδικός χαρακτήρας, 000–777 (προτιμήστε το |
| χαρακτήρας ελέγχου - 64 XOR με τον επόμενο χαρακτήρα σε κεφαλαία |
| ονομαστικός χαρακτήρας Unicode (χρειάζεται |
| Χαρακτήρας Unicode κατά σημείο κώδικα (πάντα Unicode, ακόμη και σε EBCDIC) |
Οι τροποποιητές πεζών-κεφαλαίων και παράθεσης ισχύουν μέχρι το \E ή το τέλος της συμβολοσειράς:
Ακολουθία | Σημασία |
|---|---|
| μετατροπή μόνο του επόμενου χαρακτήρα σε πεζό |
| μετατροπή μόνο του επόμενου χαρακτήρα σε titlecase (όχι κεφαλαία!) |
| πεζά μέχρι το |
| κεφαλαία μέχρι το |
| foldcase μέχρι το |
| παράθεση μεταχαρακτήρων regex μέχρι το |
| τερματίζει το πιο πρόσφατο |
Τα \L, \U, \F, \Q στοιβάζονται - καθένα χρειάζεται το δικό του \E.
say "\u$name"; # capitalise first letter
say "\U$name\E's account"; # uppercase $name, rest untouched
say "match $file literally: \Q$file\E";
Το \Q μέσα σε qq// εφαρμόζεται μετά την παρεμβολή, οπότε το qq/\Q$pat\E/ ισούται με quotemeta($pat). (Στους τελεστές παράθεσης regex qr// και m//, το \Q εφαρμόζεται μετά την παρεμβολή αλλά πριν τη μεταγλώττιση του regex - η διαφορά έχει σημασία όταν η ίδια η $pat περιέχει μεταχαρακτήρες regex που θέλετε να μείνουν κυριολεκτικοί.)
Η Perl δεν έχει διαφυγή \v στα κυριολεκτικά συμβολοσειράς - είναι μεταχαρακτήρας regex. Χρησιμοποιήστε \x0b, \cK, ή \N{VT} για κατακόρυφο στηλοθέτη.
Καθολική κατάσταση που επηρεάζει#
$"- διαχωριστής λίστας που χρησιμοποιείται κατά την παρεμβολή πινάκων και τομών. Προεπιλογή" ". Αλλάξτε μεlocal $" = ","για μία εμβέλεια.
Καμία άλλη καθολική του διερμηνέα δεν συμμετέχει στην ίδια την αποτίμηση του qq//. Οι παρεμβαλλόμενες μεταβλητές είναι φυσικά ό,τι τιμές έχουν τη στιγμή που εκτελείται το qq//.
Παραδείγματα#
Απλή παρεμβολή, ταυτόσημη σε σημασία με τη μορφή "...":
my $name = "world";
my $s = qq/hello, $name!\n/; # "hello, world!\n"
Συμβολοσειρά που περιέχει διπλά εισαγωγικά - το qq με διαφορετικό οριοθέτη αποφεύγει τη συσσώρευση backslash:
my $msg = qq{He said "yes" and then "maybe".};
# vs: "He said \"yes\" and then \"maybe\"."
Πολυγραμμικό απόσπασμα HTML με εμφωλευμένα άγκιστρα - το ζεύγος () εμφωλεύεται:
my $user = "rj";
my $html = qq(
<p>Welcome, $user.</p>
<p>You have @{[ scalar @inbox ]} messages.</p>
);
Παρεμβολή πίνακα με προσαρμοσμένο διαχωριστή:
my @tags = qw(perl rust docs);
local $" = ", ";
say qq/tags: @tags/; # "tags: perl, rust, docs"
Παγίδα κλήσης μεθόδου - το -> είναι κυριολεκτικό μέσα σε qq//:
my $obj = File::Spec->new;
qq/path is $obj->rel2abs('.')/; # "path is <stringified $obj>->rel2abs('.')"
qq/path is @{[ $obj->rel2abs('.') ]}/;
# actually calls rel2abs()
Κατασκευή αποσπάσματος SQL όπου η $ident δεν είναι έμπιστη - το \Q..\E διατηρεί τους ενσωματωμένους %, _ και τα backslashes κυριολεκτικά υπό μια ρήτρα LIKE, μόνο αφού έχετε φροντίσει για κατάλληλη παραμετροποίηση· για το πραγματικό escaping SQL χρησιμοποιήστε την παράθεση του οδηγού, όχι το \Q:
my $needle = "100% sure";
my $pat = qq/\Q$needle\E/; # the regex-safe form
# $pat eq "100\\%\\ sure"
Στοιβαγμένοι τροποποιητές:
say qq/\Qfoo \ubar \Ubaz\E qux\E done/;
# "foo\ Bar\ BAZ qux done"
# \Q quotes spaces/?; \u titlecases b; \U uppercases baz until \E;
# outer \E ends \Q.
Οριακές περιπτώσεις#
Επιλογή οριοθέτη κατά την ανάλυση. Η Perl επιλέγει τον τερματικό οριοθέτη τη στιγμή που διαβάζει τον αρχικό. Το
qq/.../αναμένει/· δεν υπάρχει τρόπος αλλαγής στη μέση της συμβολοσειράς. Αν χρειάζεστε και τα δύο είδη αγκυλών, επιλέξτε οριοθέτη που δεν είναι αγκύλη.Backslash στο τέλος συμβολοσειράς με οριοθέτη που δεν είναι αγκύλη. Το
qq/a\/είναιa/(το backslash διαφεύγει του οριοθέτη, η συμβολοσειρά συνεχίζει)· για κυριολεκτικό τελικό backslash, αλλάξτε οριοθέτη:qq{a\\}.Καμία εμφώλευση για οριοθέτες που δεν είναι αγκύλες. Το
qq|a|b|είναι η συμβολοσειράaακολουθούμενη από το αναγνωριστικόbακολουθούμενη από|- συντακτικό σφάλμα στα περισσότερα περιβάλλοντα. Επιλέξτε οριοθέτες-αγκύλες όταν το περιεχόμενο περιέχει τον χαρακτήρα του οριοθέτη.Το
#ως οριοθέτης είναι ειδική περίπτωση μόνο λόγω της αλληλεπίδρασης με τα σχόλια: τοqq#...#είναι συμβολοσειρά, αλλά τοqq #...#(με λευκό χαρακτήρα) είναι ο τελεστήςqqακολουθούμενος από σχόλιο, με τη συμβολοσειρά να λαμβάνεται από την επόμενη γραμμή. Αυτό αντικατοπτρίζει τη συμπεριφορά όλων των τελεστών της οικογένειαςq.Κενή συμβολοσειρά. Το
qq//είναι η κενή συμβολοσειρά, ίδια με την"".Παρεμβαλλόμενη
undef. Μετατρέπεται σε κενή συμβολοσειρά και, υπόuse warnings, πυροδοτεί προειδοποίησηuninitializedστο σημείο της παρεμβολής, όχι στο σημείο όπου η$varανατέθηκε σεundef.$ή@ακολουθούμενο από μη-αναγνωριστικό. Μένει κυριολεκτικό: ταqq/cost: \$5/καιqq/cost: $5/παράγουν και τα δύοcost: $5(δεν υπάρχει μεταβλητή με όνομα$5με την έννοια του αναγνωριστικού της Perl 5 - η$5είναι σύλληψη regex, η οποία υπάρχει όντως, οπότε η δεύτερη μορφή παρεμβάλλει την ομάδα σύλληψης 5, ό,τι κι αν είναι αυτή τη στιγμή). Για κυριολεκτικό$ή@, διαφύγετέ το:\$,\@.\N{...}χωρίςcharnames. Οι ονομαστικοί χαρακτήρες απαιτούν να έχει φορτωθεί στην εμβέλειαuse charnames ':full'(ή κάτι αντίστοιχο)· χωρίς αυτό λαμβάνετε σφάλμα κατά τη μεταγλώττιση. Το\N{U+HEX}και οι μορφές μονού ονόματος στο σύνολο:looseλειτουργούν και χωρίς αυτό.Αντιστοίχιση πεζών-κεφαλαίων ευαίσθητη στο locale. Με
use localeπου περιλαμβάνει τοLC_CTYPE, τα\l,\u,\L,\Uχρησιμοποιούν τους πίνακες πεζών-κεφαλαίων του τρέχοντος locale. Χωρίς αυτό, χρησιμοποιούνται οι πίνακες πεζών-κεφαλαίων του Unicode για σημεία κώδικα πάνω από 0xFF, και οι κανόνες ASCII πιο κάτω. Το\Fχρησιμοποιεί το foldcase του Unicode ανεξάρτητα από το locale (εκτός υπό locale UTF-8, όπου ταιριάζει με το\L).Μόνο ένα επίπεδο. Το αποτέλεσμα της παρεμβολής δεν επανασαρώνεται. Το
my $v = '$x'; qq/$v/είναι η τεσσάρων χαρακτήρων συμβολοσειρά$x, όχι η τιμή της$x.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
q//- κυριολεκτικό σε μονά εισαγωγικά, χωρίς παρεμβολή, ίδιοι κανόνες διαχωριστήqw//- κυριολεκτικό λίστας λέξεων, παράγει λίστα συμβολοσειρών χωρισμένων σε λευκούς χαρακτήρεςqx//- παρεμβαλλόμενη συμβολοσειρά που εκτελείται ως εντολή κελύφους, αποτυπώνει το stdoutqr//- παρεμβαλλόμενο regex, μεταγλωττίζεται μία φορά και είναι επαναχρησιμοποιήσιμοsprintf- καταφύγετε σε αυτή όταν η εργασία είναι η μορφοποίηση αριθμών ή η συμπλήρωση πεδίων, όχι η παρεμβολή μεταβλητών σε κείμενοquotemeta- η συνάρτηση που καλεί το\Q..\Ejoin- αυτό που κάνει στα κρυφά η παρεμβολή πινάκων, με την$"ως διαχωριστή$"- διαχωριστής λίστας που χρησιμοποιείται όταν ένας πίνακας παρεμβάλλεται σε συμβολοσειρά διπλών εισαγωγικώνΤελεστές παράθεσης και τελεστές τύπου παράθεσης - ο πλήρης πίνακας των
q,qq,qx,qw,qr,m,s,trκαι των κοινών τους κανόνων οριοθέτη και διαφυγής