Schrift
[thread]11304[/thread]

Listegröße falsch angezeigt und Fehlermeldungen (Seite 2)



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Gast Gast
 2008-02-15 13:43
#105920 #105920
statt
Code (perl): (dl )
return @puffer,$rechnungsnummer,$rechnungsdatum,$buchungskonto;

besser
Code (perl): (dl )
return $rechnungsnummer,$rechnungsdatum,$buchungskonto,@puffer;

denn übergeben wird alles immer in einem Array und mit
Code (perl): (dl )
($w1,$w2,$w3,@rest)=funktion()
verteilst du den Inhalt des zurückgelieferten Arrays auf Variablen. Anders herum landet alles im Array, und die anderen Variablen gehen leer aus.
SchaubFD
 2008-02-15 13:53
#105921 #105921
User since
2008-02-13
14 Artikel
BenutzerIn
[default_avatar]
Danke Gast,

eines bleibt aber, wie macht man es syntaktisch richtig? Weil deine Antwort bedeutet auch, das man nur eine Liste am Ende Übergeben darf, wenn ich es nicht falsch sehe.
Struppi
 2008-02-15 14:32
#105922 #105922
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Das wurde dir doch bereits ausführlich in dem anderen Thread erklärt. Ein Hash verhält sich genauso wie eine Liste.
nepos
 2008-02-15 14:33
#105923 #105923
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Exakt. Am sichersten ist es aber wohl, hier einfach die Referenzen zu übergeben.
Das ist anfangs oft ein wenig verwirrend, aber wenn mans mal verstanden hat, kein Problem mehr.
Code (perl): (dl )
return @puffer,$rechnungsnummer,$rechnungsdatum,$buchungskonto;

Wenn du so Daten an den Aufrufer zurückgibst, sieht dieser eigentlich nur eine Liste/Array mit allen Daten. Hier kann nicht mehr unterschieden werden, wie lang nun @puffer eigentlich war, um die anderen drei Skalare korrekt in die Variablen zu packen.
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)
SchaubFD
 2008-02-18 16:02
#106065 #106065
User since
2008-02-13
14 Artikel
BenutzerIn
[default_avatar]
Hallo,

also ich versuche mich ja zu bessern, möglich das ich im Eifer des Gefechts ja die Listen überlesen habe. Ich komme langsam mit Perl zurecht. Habe das Programm im ersten Schritt fast fertig, auch mit der erwähnten Sortierung.

Was mir derzeit fehlt ist ein gutes Buch zum Einstieg in Perl, aber da kann ich das Forum ja mal durchsuchen.

Danke an Jeden, der Geduld mit mir hatte und geholfen hat.
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2008-02-15 10:43.