Hier ist der Testcase
Das Paradigma ist 'use strict'
über etwas anderes brauchen wir gar nicht mehr diskutieren.
Perl Version 5.8
_____________________________________________________________________
#!C:/Programme/Perl/bin/perl.exe
use warnings;
use strict;
my @arr;
push( @arr , [21, 22, 23] , ['a', 'b', 'c'] );
foreach ( @arr ){
$_->[2]eq 23 and print STDOUT '1. $_->[2] ist ', $_->[2], "\n";
$$_[2]eq 23 and print STDOUT '2. $$_[2] ist ', $$_[2], "\n";
${$_}[2] eq 23 and print STDOUT '3. ${$_}[2] ist ', ${$_}[2], "\n";
@$_->[2] eq 23 and print STDOUT '4. @$_->[2] ist ', @$_->[2], "\n";
@$_[2] eq 23 and print STDOUT '5. @$_[2] ist ', @$_[2], "\n";
@{$_}[2] eq 23 and print STDOUT '6. @{$_}[2] ist ', @{$_}[2], "\n";
}
print STDOUT "\ndone\n";
sleep(10);
exit;
__END__
_____________________________________________________________________
Resultat:
1, 2, 3, 5, 6 produzieren ohne Warnung das gesuchte Ergebnis
4 erzeugt eine Warnung 'Using an array as reference is deprecated'
Das bedeutet:
@$_->[2] ?= @$_[2] == @{$_}[2]
Woraus man was für den Interpreter schliessen kann?
Das intern der Interpreter auf eine Abiguitat bei @$_->[2] trifft,
einen zweiten Anlauf holen muss, und die Warnung ausgibt.
Man merke dass die Fälle 4, 5 und 6 unnötig einen Array-Slice bilden,
vom dem dann doch nur das dritte Element verwendet wird.
Das ist nicht falsch aber nicht performant.
Ist dieser Test einhellig nachvollziehbar für euch?
mfg Beat