Τελεστές subscript και τομής#
Η οικογένεια αγκυλών και αγκίστρων που επιλέγει στοιχεία από πίνακες και hashes - και η οικογένεια αγκίστρων αποαναφοράς που κάνει το ίδιο μέσω αναφοράς.
Μορφή | Επιλέγει | Περιέκτης | Τύπος αποτελέσματος |
|---|---|---|---|
| ένα στοιχείο | πίνακας | scalar |
| ένα στοιχείο | hash | scalar |
| πολλά στοιχεία (τομή) | πίνακας | λίστα |
| πολλά στοιχεία (τομή) | hash | λίστα |
| τομή κλειδιού/τιμής | πίνακας | λίστα (k,v…) |
| τομή κλειδιού/τιμής | hash | λίστα (k,v…) |
Λίγοι κανόνες καλύπτουν και τους δώδεκα συνδυασμούς.
Το sigil σηματοδοτεί το αποτέλεσμα, όχι τον περιέκτη#
Η @arr είναι ο πίνακας· η $arr[3] είναι ένα από τα στοιχεία του. Το αρχικό sigil σας λέει τι είδος τιμής προσπελαύνετε - βαθμωτό ($), λίστα τιμών (@), λίστα κλειδιού/τιμής (%):
my @arr = (10, 20, 30, 40, 50);
$arr[2] # 30 - scalar (single element)
@arr[1, 3] # (20, 40) - list of values at those indices
%arr[1, 3] # (1 => 20, 3 => 40) - list of (index, value) pairs
my %h = (a => 1, b => 2, c => 3);
$h{a} # 1 - scalar
@h{'a', 'c'} # (1, 3) - list of values
%h{'a', 'c'} # (a => 1, c => 3) - list of (key, value) pairs
Οι μορφές «%-τομή» (%arr[...], %hash{...}) είναι μια προσθήκη της Perl 5.20 που επιστρέφει ζεύγη κλειδιού/τιμής ως λίστα. Είναι το σωστό εργαλείο όταν θέλετε αντίγραφο μέρους ενός hash:
my %selected = %h{ qw(a c) }; # %selected = (a => 1, c => 3)
Αρνητικοί δείκτες σε πίνακες#
Οι αρνητικοί δείκτες πίνακα μετρούν από το τέλος:
$arr[-1] # last element
$arr[-2] # second-from-last
@arr[-3..-1] # last three elements as a slice
Οι θετικοί δείκτες εκτός εύρους διαβάζονται ως undef. Οι αρνητικοί δείκτες εκτός εύρους (πιο πίσω από την αρχή) εγείρουν μοιραίο σφάλμα χρόνου εκτέλεσης:
my @a = (1, 2, 3);
$a[10] # undef (with no warning)
$a[-10] # FATAL: Modification of non-creatable array value
# (the error wording reflects how the lookup is implemented)
Τομή ως lvalue#
Τόσο οι τομές πίνακα όσο και οι τομές hash είναι έγκυροι στόχοι ανάθεσης:
@arr[0, 2, 4] = ('A', 'C', 'E'); # set positions 0, 2, 4
@h{qw(a b c)} = (1, 2, 3); # set three hash keys
(@arr[0, 1], @arr[1, 0]) = ... # be careful: aliasing!
Μπορείτε να ανταλλάξετε στοιχεία μέσω ανάθεσης τομής χωρίς προσωρινή μεταβλητή:
@arr[$i, $j] = @arr[$j, $i]; # swap two array elements
@h{$key1, $key2} = @h{$key2, $key1}; # swap two hash values
Αυτόματη εισαγωγή κλειδιού hash σε εισαγωγικά#
Μέσα σε {} για subscripts hash, τα αναγνωριστικά bareword γίνονται αυτόματα εισαγωγικά:
$h{name} # same as $h{'name'}
$h{first_name} # same as $h{'first_name'}
$h{1_2} # FATAL - not a valid bareword identifier
$h{"1_2"} # quote it explicitly
Αυτή είναι μία από τις πιο αγαπημένες (και πιο προκαλούσες σφάλματα) ευκολίες της Perl. Η απόφαση bareword-ή-όχι γίνεται κατά τη χρονική στιγμή ανάλυσης βάσει του κυριολεκτικού διακριτικού· σταθερές και υπολογιζόμενες τιμές δεν επωφελούνται:
use constant KEY => 'name';
$h{KEY} # WRONG - this is the bareword "KEY", not the constant!
$h{KEY()} # use empty parens to force function-call evaluation
$h{+KEY} # or unary +, the canonical workaround
Η μορφή +KEY είναι ο πιο συμπαγής τρόπος να πείτε «αυτό δεν είναι bareword, αποτίμησέ το ως έκφραση».
Δείκτες πίνακα: εξαναγκασμένοι σε ακεραίους, χωρίς αυτόματα εισαγωγικά#
Οι δείκτες [] αποτιμούνται ως εκφράσεις και εξαναγκάζονται σε ακεραίους (αποκοπτόμενοι προς το μηδέν):
$arr[1.7] # $arr[1] - 1.7 truncates to 1
$arr["3"] # $arr[3] - string coerces to integer
$arr[$#arr] # last element ($#arr is last valid index)
Η σύνταξη $#arr μέσα σε subscripts είναι ιδιωματική για «τελευταίο»:
$arr[$#arr] # last
@arr[0..$#arr] # all of @arr (verbose; just write @arr)
@arr[1..$#arr] # all except first
Ανάμιξη - πολυδιάστατη πρόσβαση#
Η Perl 5 δεν έχει εγγενείς πολυδιάστατους πίνακες· τα εμφωλευμένα δεδομένα κατασκευάζονται από αναφορές:
my @grid = ([1,2,3], [4,5,6], [7,8,9]);
$grid[1][2] # 6 - chained subscripts on AoA
$grid[1]->[2] # same - the arrow is optional between subscripts
$grid[$y][$x]
Το βέλος μεταξύ subscripts υπονοείται από τη γραμματική της Perl: όταν δύο subscripts ακολουθούν αμέσως το ένα μετά το άλλο σε αλυσίδα αποαναφοράς, το -> μπορεί να παραλειφθεί. Δείτε arrow.
Δείτε επίσης#
Arrow -
->[]και->{}για πρόσβαση μέσω αναφοράς· ο κανόνας παράλειψης βέλους.Assignment - ανάθεση τομής· αποδόμηση πολλαπλών στόχων.
exists,delete- μορφές perlfunc που δέχονται έκφραση subscript.keys,values- μορφές ολόκληρου περιέκτη· οι τελεστές τομής είναι οι μερικές μορφές.Arrays, Hashes - οι σελίδες τύπων δεδομένων εξηγούν τον κανόνα sigil-έναντι-αποτελέσματος που ορίζει ποια μορφή subscript να χρησιμοποιήσετε.