Τελεστές subscript και τομής#

Η οικογένεια αγκυλών και αγκίστρων που επιλέγει στοιχεία από πίνακες και hashes - και η οικογένεια αγκίστρων αποαναφοράς που κάνει το ίδιο μέσω αναφοράς.

Μορφή

Επιλέγει

Περιέκτης

Τύπος αποτελέσματος

$arr[i]

ένα στοιχείο

πίνακας

scalar

$hash{key}

ένα στοιχείο

hash

scalar

@arr[i, j, k]

πολλά στοιχεία (τομή)

πίνακας

λίστα

@hash{k1, k2}

πολλά στοιχεία (τομή)

hash

λίστα

%arr[i, j, k]

τομή κλειδιού/τιμής

πίνακας

λίστα (k,v…)

%hash{k1, k2}

τομή κλειδιού/τιμής

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 να χρησιμοποιήσετε.