Τελεστής βέλους#
Ο μεμονωμένα πιο συχνά χρησιμοποιούμενος τελεστής σε λειτουργική Perl, μετά το =. Κάνει τρία πράγματα σε τρεις συντακτικές θέσεις, και όλα ξεκινούν αποαναφέροντας κάτι στα αριστερά.
Μορφή | Σημαίνει | Παράδειγμα |
|---|---|---|
| στοιχείο αναφοράς πίνακα |
|
| στοιχείο αναφοράς hash |
|
| κλήση coderef |
|
| κλήση μεθόδου σε αντικείμενο |
|
| κλήση μεθόδου με ορίσματα |
|
| κλήση μεθόδου κλάσης |
|
Οι πρώτες τρεις μορφές είναι αποαναφορά. Οι τελευταίες τρεις είναι αποστολή μεθόδου. Και οι δύο γράφονται με ->.
Αποαναφορά#
Μια αναφορά είναι ένα βαθμωτό που δείχνει σε έναν περιέκτη ή ένα coderef. Δεν μπορείτε να κάνετε δεικτοδότηση σε μια αναφορά απευθείας με [] ή {}· πρέπει πρώτα να αποαναφέρετε, και η -> είναι ο κανονικός τρόπος:
my @arr = (10, 20, 30);
my $aref = \@arr;
$arr[0] # 10 - direct array access
$$aref[0] # 10 - dereference, then subscript (old syntax)
$aref->[0] # 10 - dereference and subscript in one move
$aref->[-1] # 30 - negative indices work the same way
my %h = (name => 'John');
my $href = \%h;
$h{name} # 'John'
${$href}{name} # 'John' - full deref + subscript
$href->{name} # 'John' - same, idiomatic form
Ενεργοποίηση coderef#
my $f = sub { $_[0] * 2 };
$f->(5) # 10 - invoke the coderef with argument 5
&$f(5) # same - older syntax, still works
Η μορφή ->() προτιμάται στη σύγχρονη Perl. Κενή λίστα ορισμάτων είναι $f->().
Παράλειψη βέλους μεταξύ subscripts#
Όταν δύο subscripts ακολουθούν άμεσα το ένα το άλλο σε αλυσίδα αποαναφοράς, το δεύτερο βέλος μπορεί να παραλειφθεί. Η γραμματική το υπονοεί:
$grid[1]->[2] # explicit
$grid[1][2] # arrow elided - the only way most people write this
$tree->{children}[0]{name} # parses with arrows between every pair
# - the chain is read as a sequence
# of subscripts on the same deref path
Το πρώτο βέλος (μεταξύ βαθμωτής μεταβλητής και του πρώτου subscript) είναι υποχρεωτικό. Μόνο βέλη μεταξύ διαδοχικών subscripts μπορούν να παραλειφθούν.
$aref->[0]->[1] # explicit
$aref->[0][1] # elided second arrow - fine
$aref[0][1] # WRONG - $aref[0] reads from @aref, not the
# arrayref in $aref. Different variable!
Ο κανόνας πρώτου βέλους είναι η πηγή ανεπαίσθητων σφαλμάτων κατά την αναδιοργάνωση $aref->[0] σε βαθύτερη έκφραση - κρατήστε το αρχικό βέλος.
Κλήσεις μεθόδων#
Όταν η δεξιά πλευρά του -> είναι ένα αναγνωριστικό (ή μια έκφραση ονόματος σε παρενθέσεις), ερμηνεύεται ως κλήση μεθόδου αντί για subscript:
$obj->print; # call $obj->print()
$obj->name; # accessor: returns $obj->name
$obj->set_name("Alice"); # mutator: sets and may return $obj
Foo::Bar->new(arg => 1); # class method call
$obj->$method_name(@args); # method name in a variable
$class->can('foo') # can() - does method exist?
Οι κλήσεις μεθόδων αποστέλλονται μέσω του πακέτου στο οποίο είναι blessed το αντικείμενο. Η ακριβής διαδρομή επίλυσης ελέγχεται από τη @ISA και τον επιλεγμένο MRO· δείτε τον OOP guide για την πλήρη ιστορία.
Σύνταξη έμμεσου αντικειμένου - μην τη χρησιμοποιείτε#
Η Perl 5 ιστορικά επέτρεπε print $fh "foo" και new Foo @args χωρίς βέλος. Αυτές οι μορφές εξακολουθούν να αναλύονται αλλά είναι ευαίσθητες στο περιβάλλον με τρόπους που εκπλήσσουν - η σύνταξη έμμεσου αντικειμένου μπορεί να επιλύσει τη new (ή ό,τι) τη λάθος στιγμή. Η σύγχρονη κατεύθυνση είναι να χρησιμοποιείτε πάντα -> για κλήσεις μεθόδων:
my $obj = Foo->new(@args); # correct
my $obj = new Foo @args; # avoid (still parses)
print $fh "hello\n"; # OK - print is special
$fh->print("hello\n"); # also fine, prefer this
# for IO::File-style handles
Προτεραιότητα#
Η -> είναι η γραμμή 2 του πίνακα precedence - δεύτερη μόνο μετά τους όρους και τελεστές λίστας. Δένει σφιχτότερα από κάθε άλλον τελεστή, κάτι που θέλετε: η $h->{a} + $h->{b} αναλύεται ως άθροισμα δύο αναζητήσεων hash, όχι ως αναζήτηση {a + $h->{b}}.
Δείτε επίσης#
Subscript - απευθείας (χωρίς αποαναφορά) πρόσβαση πίνακα/hash· ο κανόνας παράλειψης βέλους.
References tutorial - πλήρης αντιμετώπιση αναφορών, συμπεριλαμβανομένου πώς η
\τις κατασκευάζει και πώς λειτουργούν οι εναλλακτικές αποαναφοράς (@{...},%{...},${...}).OOP guide -
->methodκαι αποστολή κλάσης σε βάθος.ref,bless- εργαλεία perlfunc που ζευγαρώνουν με τους δύο ρόλους του τελεστή βέλους.References - τι παράγει η
\Xκαι πώς συνθέτονται οι μορφές αποαναφοράς (@{...},%{...},${...}).