Τελεστής βέλους#

Ο μεμονωμένα πιο συχνά χρησιμοποιούμενος τελεστής σε λειτουργική Perl, μετά το =. Κάνει τρία πράγματα σε τρεις συντακτικές θέσεις, και όλα ξεκινούν αποαναφέροντας κάτι στα αριστερά.

Μορφή

Σημαίνει

Παράδειγμα

$ref->[i]

στοιχείο αναφοράς πίνακα

$aref->[0]

$ref->{k}

στοιχείο αναφοράς hash

$href->{name}

$ref->(...)

κλήση coderef

$cref->(@args)

$obj->meth

κλήση μεθόδου σε αντικείμενο

$obj->print

$obj->meth(@a)

κλήση μεθόδου με ορίσματα

$obj->set_x(42)

$class->meth

κλήση μεθόδου κλάσης

Foo::Bar->new

Οι πρώτες τρεις μορφές είναι αποαναφορά. Οι τελευταίες τρεις είναι αποστολή μεθόδου. Και οι δύο γράφονται με ->.

Αποαναφορά#

Μια αναφορά είναι ένα βαθμωτό που δείχνει σε έναν περιέκτη ή ένα 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 και πώς συνθέτονται οι μορφές αποαναφοράς (@{...}, %{...}, ${...}).