Τελεστές κόμματος#
Δύο τελεστές, και οι δύο γραμμένοι με κόμμα - ο ένας γραμμένος ως «fat comma» με =>. Είναι συντακτικά ίδιοι στις περισσότερες θέσεις αλλά διαφέρουν στον κανόνα bareword της αριστερής πλευράς.
Τελεστής | Διαβάζεται ως | Τι κάνει |
|---|---|---|
| κόμμα | διαχωριστής λίστας (σε περιβάλλον λίστας)· απόρριψη-και-επιστροφή-δεξιού (σε βαθμωτό περιβάλλον) |
| fat comma | ίδιο με |
Σε περιβάλλον λίστας - κατασκευή λιστών#
Σε περιβάλλον λίστας το κόμμα είναι ο διαχωριστής στοιχείων λίστας:
my @items = (1, 2, 3, 4); # 4-element list
my @flat = (1, 2, (3, 4), 5); # (1,2,3,4,5) - lists flatten
my @kv = (a => 1, b => 2); # 4-element list: a, 1, b, 2
my %h = (a => 1, b => 2); # hash from key-value pairs
Οι λίστες στην Perl είναι επίπεδες - δεν υπάρχει τιμή εμφωλευμένης λίστας. Μια λίστα ενσωματωμένη σε μια άλλη εξαφανίζεται: τα στοιχεία της γίνονται απλώς στοιχεία της εξωτερικής λίστας. Για εμφωλευμένη δομή χρειάζεστε αναφορές (δείτε References tutorial):
my @flat = (1, 2, (3, 4), 5); # (1,2,3,4,5) - 5 elements
my @nested = (1, 2, [3, 4], 5); # (1, 2, ARRAYREF, 5) - 4 elements
Σε βαθμωτό περιβάλλον - το κόμμα είναι «απόρριψη, στη συνέχεια επιστροφή δεξιού»#
Όταν μια έκφραση κόμματος εξαναγκάζεται σε βαθμωτό περιβάλλον - με ανάθεση σε βαθμωτό, με scalar(...), ως συνθήκη ενός if - αποτιμά κάθε τελεστέο από αριστερά προς τα δεξιά για παρενέργειες, στη συνέχεια δίνει την τιμή του δεξιότερου τελεστέου:
my $x = (1, 2, 3); # $x = 3 - but warn under
# `use warnings`: "Useless use of
# a constant in void context"
# for 1 and 2
my $r = (do_a(), do_b(), final_value()); # runs all three, returns
# the last value
Αυτή η χρήση είναι σπάνια στη σύγχρονη Perl - το ιδίωμα for(init, init; cond; step, step) τύπου C είναι η κύρια θέση που το συναντάτε (και ακόμα εκεί, οι παρενθέσεις γύρω από την υπο-έκφραση κόμματος είναι συνετές).
=> - το fat comma#
Ο => κάνει το ίδιο πράγμα με το , επιπλέον κάνει αυτόματα εισαγωγικά στο bareword με μορφή αναγνωριστικού στα αριστερά του:
my %h = (
name => "John", # 'name' auto-quoted
age => 30,
"key with spaces" => "...", # quote required for non-bareword
);
# Equivalent without =>, requiring explicit quoting:
my %h = (
'name', "John",
'age', 30,
'key with spaces', '...',
);
Η αυτόματη εισαγωγή σε εισαγωγικά εφαρμόζεται μόνο όταν η αριστερή πλευρά είναι ένα συντακτικά έγκυρο αναγνωριστικό bareword - γράμματα, ψηφία, κάτω παύλες, αρχίζοντας με γράμμα ή κάτω παύλα. Άλλες μορφές δεν γίνονται αυτόματα εισαγωγικά:
( name => 1 ) # 'name' auto-quoted - fine
( "name" => 1 ) # already a string - fine
( $variable => 1 ) # $variable evaluated - fine
( 0+1 => 1 ) # numeric expression - fine
( -name => 1 ) # WRONG - looks like negative bareword;
# parses as -('name') which is the
# numeric negation of a string. Quote it.
( CONST => 1 ) # 'CONST' auto-quoted - does NOT call
# the constant CONST!
( CONST() => 1 ) # explicit empty parens - calls CONST
Η αλληλεπίδραση με σταθερές είναι η πιο συνηθισμένη έκπληξη - δείτε επίσης τη σελίδα subscript σχετικά με την αυτόματη εισαγωγή κλειδιών hash σε εισαγωγικά, που έχει το ίδιο μοτίβο.
Κοινά ιδιώματα#
# Function arguments - the comma is just the argument separator
some_function($arg1, $arg2, $arg3);
# Hash construction - fat-comma communicates "this is a key"
my %config = (
host => 'localhost',
port => 8080,
user => $ENV{USER},
);
# List literal - interchangeable
my @months = (qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/);
# Trailing comma - allowed and idiomatic for diff-friendly multi-line literals
my @list = (
"first",
"second",
"third", # trailing comma is fine
);
Το τελικό κόμμα είναι σκόπιμο: σας επιτρέπει να προσθέσετε, αφαιρέσετε ή αναδιατάξετε στοιχεία λίστας χωρίς να αγγίξετε γειτονικές γραμμές, κάτι που εμφανίζεται ως καθαρότερα diffs στον έλεγχο εκδόσεων.
Προτεραιότητα#
Τα , και => βρίσκονται στη γραμμή 20 - χαλαρότερα από την ανάθεση, σφιχτότερα μόνο από τους λογικούς τελεστές σε μορφή λέξης (and/or/not/xor) και τους τελεστές λίστας στη δεξιά τους θέση. Γι” αυτό μια λίστα αναθέσεων λειτουργεί:
my $a = 1, my $b = 2; # WRONG: parses as (my $a = 1), my $b = 2
# - comma at outer level, not list assignment.
# $a is 1, $b is 2, but the warning is loud.
my ($a, $b) = (1, 2); # the right way: list assignment
Δείτε επίσης#
Assignment - η ανάθεση λίστας βασίζεται στον ρόλο του κόμματος σε περιβάλλον λίστας.
Subscript - αυτόματη εισαγωγή
$h{name}σε εισαγωγικά, η παράλληλη περίπτωση τουname => ....use constant- η σύγκρουση bareword/σταθεράς είναι η κανονική παγίδα του fat comma.Context - η ιστορία λίστας-έναντι-βαθμωτού πίσω από το γιατί το
,σημαίνει δύο διαφορετικά πράγματα.