2013-10-12 22 views
5

In den folgenden perl Schnipsel:Warum kann ich diese Behandlung als Referenz drucken und sie als Skalar behandeln?

my $a1 = [ qw(rock pop musical) ]; 
my $b1 = [ qw(mystery action drama)]; 
my $c1 = [ qw(biography novel periodical)]; 

my @a2d = ( 
    $a1, 
    $b1, 
    $c1 
); 

Die @a2d ein Array ist, die Verweise auf Arrays enthalten.
Meine Frage ist, warum die folgenden Druck die gleiche Sache (musical) ?:

print ${$a2d[0]}[2],"\n"; 
print $a2d[0][2],"\n"; 

ich die zweite erwartete ARRAY zu drucken oder einen Fehler, da die Elemente des Arrays sind refences

Antwort

9

Die dereferenzieren wird impliziert, wenn Sie Indizes indexieren.

$a2d[0][2] 

ist die Abkürzung für

${ $a2d[0] }[2] 

aka

$a2d[0]->[2] 

Anstatt einen Syntaxfehler gibt, bietet eine nützliche Perl Verknüpfung für einen gemeinsamen Betrieb.

Weitere Beispiele: $aoa[$i][$j], $aoh[$i]{$k}, $hoa{$k}[$i] und $hoh{$k1}{$k2}.

10

Die $a2d[0] ist eine Array-Referenz. Wir können diese Array-Referenz nehmen und den 3. Eintrag ausdrucken:

my $ref = $a2d[0]; 
say ${ $ref }[2]; 
say $ref->[2]; 

Diese Formulare sind gleichwertig. Jetzt können wir mit dieser Zwischengröße abschaffen, und erhalten:

say ${ $a2d[0] }[2]; 
say $a2d[0]->[2]; 

Wenn der Dereferenzierungsoperator -> zwischen zwei Indizes auftritt, dann kann es als Abkürzung weggelassen werden:

say $a2d[0][2]; 

Der Pfeil kann weggelassen werden, wenn der linke Index [...] oder {...} und der rechte Index it [...], {...} oder (...) ist.

Dies wird auch in perlreftut erklärt, die diese Überlegungen vertieft. Das Lesen dieses Dokuments sollte viele Fragen klären.