Thread Listegröße falsch angezeigt und Fehlermeldungen (15 answers)
Opened by SchaubFD at 2008-02-15 10:43

KurtZ
 2008-02-15 16:38
#105933 #105933
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Hallo Renate,

SchaubFD+2008-02-15 12:19:30--
Code: (dl )
return @puffer,$rechnungsnummer,$rechnungsdatum,$buchungskonto;


hmm scheint dass sich meine Ausführungen im -> anderen Thread voll gelohnt haben. :-(

Was deine Probleme mit den Sigils anbelangt, in Perl5 beschreibt das Sigil primär die Rückgabeform eines Variablenzugriffs und erst sekundär den Typ. Der zugrundeliegende Typ erschließt sich nur aus den Klammern/Pfeilen die dem Variablennamen folgen.

Für ein Array namens "arr" variert die Rückgabe folgendermaßen
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#=  die Referenz
\@arr           $arr_ref       
#= die "Listenform"              
@arr             @{$arr_ref}        @$arr_ref
#= das nte  Element      
$arr[n]          $arr_ref->[n]       $$arr_ref[n] 
#= flache Kopie des Array
@A=@B      $A_r=[ @$B_r ]
#= Alias des Array
?                  $A_r=$B_r


Zudem gibts noch anonyme Arrays
Code (perl): (dl )
1
2
(a,b,c)          @{ [a,b,c] }       #= Listenform
[a,b,c]                                       #= Referenz


zudem gibts zum Dereferenzieren auch mehrere Abkürzungsmöglickeiten
Code (perl): (dl )
1
2
$arr_ref -> [x] -> [y]-> {"abc"};
$$arr_ref [x] [y] {abc}


Für Hashes ist es analog, du musst nur @ -> % und [] -> {} ändern.

Du siehst man kann auch sehr effizient mit Referenzen arbeiten, und hat dann das in anderen Sprachen "gängige" Verhalten!

Der Syntax erlaubt auch viel mehr Kombinationsmöglichkeiten als du denkst!
Sowas wie @arr[liste] ist nämlich ein Arrayslice, d.h. es wird ein Teilarray zurückgegeben (deswegen @] aus des Array arr (ersichtlich an den Brackets "[..]"), die Elemente des Teilarrays werden in der Liste bestimmt. Als Sonderfall gilt deswegen (verwirrenderweise)
Code (perl): (dl )
 @arr[n]=$arr[n] 
, aber da hört die Gleichwertigkeit auch auf. siehe perlfaq -> Difference @a[1] and $a[1]

Was auch viel zu selten klar gemacht wird, ist das sich der Rückgabewert aus Rückgabeform UND Kontext ergibt.

Skalarkontext der Listenform gibt mir nämlich die Länge des Arrays
Code (perl): (dl )
$x =  @arr    = scalar @arr


Wenn ich also die Länge eines Teilarrays ermitteln will, muss ich im scalaren Kontext die Listenform der Referenz auswerten.

Code (perl): (dl )
1
2
3
4
@arr = ( 0, [ 10, 11 ] , 2, 3 );
$refA = [ [ 00, 01, 02 ] , 1, 2 ];
$var= @{ $arr[1] };                                 #= 2
print $var ,  "  " , scalar @{ $$refA[0] };  #= '2   3'


Wenn dir das aber zu verwirrend ist, solltest du vielleicht zu einer anderen Sprache ausweichen!

PS: @alle: Für Code wäre ein Courier-Font besser, die Einrückungen gehen kaputt!
TMTOWTDYOG (there's more than one way to dig your own grave)

View full thread Listegröße falsch angezeigt und Fehlermeldungen