Τελεστές συμβολοσειράς#
Δύο τελεστές σε αυτή την οικογένεια - συνένωση και επανάληψη. Παίζουν τον ίδιο ρόλο για συμβολοσειρές που παίζουν οι + και * για αριθμούς.
Τελεστής | Πράξη | Πληθικότητα | Προσεταιριστικότητα | Περιβάλλον |
|---|---|---|---|---|
| συνένωση | δυαδικός | αριστερά | συμβολοσειρά |
| επανάληψη | δυαδικός | αριστερά | μικτό |
Και οι δύο εξαναγκάζουν τους τελεστέους τους σε περιβάλλον συμβολοσειράς (με τη συνήθη μετατροπή αριθμού-σε-συμβολοσειρά: 42 γίνεται "42", 1.5 γίνεται "1.5", κλπ.).
. - συνένωση#
Ενώνει τους δύο τελεστέους. Το αποτέλεσμα είναι η συνένωση της αριστερής και δεξιάς συμβολοσειράς:
"Hello" . " " . "World" # "Hello World"
"x = " . 42 # "x = 42" (numeric coercion)
"err: " . $! # "err: <strerror>"
Η σύνθετη .= προσθέτει επιτόπου:
my $s = "a";
$s .= "b"; # "ab"
$s .= "c"; # "abc"
Η .= είναι ταχύτερη από $s = $s . "..." για επαναλαμβανόμενη προσθήκη - όχι με ασυμπτωτικό περιθώριο στη σύγχρονη Perl, αλλά αρκετά για να έχει σημασία σε σφιχτούς βρόχους σε μεγάλες συμβολοσειρές. Το runtime του pperl μεταλλάσσει τον εσωτερικό ενταμιευτή επιτόπου όταν το πλήθος αναφορών της συμβολοσειράς είναι 1 (δείτε Σημειώσεις ειδικές για PetaPerl παρακάτω).
Για μεγάλο αριθμό τμημάτων, η join είναι γενικά πιο σαφής από μια αλυσίδα .:
join(", ", @items)
"hello, world, !" # hand-built; readable for small arity
join(", ", $a, $b, $c, $d) # cleaner than $a.", ".$b.", ".$c.", ".$d
x - επανάληψη#
Επαναλαμβάνει τον αριστερό τελεστέο έναν αριθμό φορών δεδομένο από τον δεξιό τελεστέο. Η συμπεριφορά εξαρτάται από το περιβάλλον του αριστερού τελεστέου:
Βαθμωτό περιβάλλον στα αριστερά → επανάληψη συμβολοσειράς.
Περιβάλλον λίστας στα αριστερά (παρενθέσεις γύρω από τον αριστερό τελεστέο) → επανάληψη λίστας.
"ab" x 3 # "ababab" (string)
"-" x 40 # 40-character ruler
(0) x 5 # (0, 0, 0, 0, 0) (list)
(1, 2) x 3 # (1, 2, 1, 2, 1, 2)
Η διάκριση με παρενθέσεις-στα-αριστερά μπερδεύει τους αρχάριους. Χωρίς παρενθέσεις, η αριστερή πλευρά είναι σε βαθμωτό περιβάλλον ανεξάρτητα από πώς φαίνεται:
1, 2 x 3 # (1, "222") -- Whoops.
# x binds tighter than , so this is
# (1, (2 x 3)) - and 2 in scalar context
# stringifies, so 2 x 3 is "222".
(1, 2) x 3 # (1, 2, 1, 2, 1, 2) -- list repetition
Η σύνθετη x= αναπαράγει επιτόπου:
my $line = "=";
$line x= 40; # "========================================"
Μη θετικό πλήθος επιστρέφει κενή συμβολοσειρά (ή κενή λίστα σε περιβάλλον λίστας), χωρίς προειδοποίηση:
"abc" x 0 # ""
"abc" x -3 # ""
("a", "b") x 0 # ()
Μη ακέραιο πλήθος αποκόπτεται προς το μηδέν:
"x" x 3.7 # "xxx" (3.7 truncates to 3)
"x" x -0.5 # ""
Αριθμητικοί έναντι συμβολοσειριακών τελεστών#
Η ανάμιξη αριθμητικών και συμβολοσειριακών τελεστών στον ίδιο τελεστέο παράγει προβλέψιμα αλλά μερικές φορές εκπληκτικά αποτελέσματα, επειδή κάθε τελεστής επιβάλλει το δικό του περιβάλλον:
"5" + "3" # 8 (+ wants numeric → both coerce to numbers)
5 . 3 # "53" (. wants string → both coerce to strings)
"5" * "3" # 15
5 x 3 # "555" (x wants string left, number right)
Δεν υπάρχει τελεστής που «μαντεύει» - ο τελεστής επιλέγει το περιβάλλον, τελεία.
Δείτε επίσης#
Arithmetic operators - οι
+και*είναι τα αριθμητικά ανάλογα των.καιx.String comparison - σύγκριση συμβολοσειρών αντί για κατασκευή τους.
join,sprintf,substr- μορφές perlfunc κοινών πράξεων κατασκευής συμβολοσειρών.