Beat: Testcase

Beitrag lesen

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