Thread Listegröße falsch angezeigt und Fehlermeldungen
(15 answers)
Opened by SchaubFD at 2008-02-15 10:43
Hallo Renate,
SchaubFD+2008-02-15 12:19:30-- 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 zudem gibts zum Dereferenzieren auch mehrere Abkürzungsmöglickeiten 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] 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)
|