Kurt Z: Perl Listen, Arrays und Referenzen

Beitrag lesen

Hi Tim

Mein Perl ist brüchig bis kaum vorhanden, aber wenn Du mit Perl-Listen die Syntax ($a, $b, $c) meinst und Perl-Arrays die Syntax [$a, $b, $c], dann .. sind pythonische Tupel immer noch nicht wirklich Listen im Sinne von Perl, so dass Interpolation statt findet. Im Tupel ist dann immer noch eine Referenz gespeichert:

schon klar, ich schrieb bewußt "eher" weil Perl-Listen halt nicht veränderbare Arrays sind, um mit deinen Worten zu sprechen:

Idealerweise stellst Du Dir Tupel nicht als „nicht veränderbare Listen“

Es gibt aber keine Listenvariablen, man kann Listen einer Arrayvariable zuweisen, aber dann wird daraus ein Array. Wie das Arrray dann wideregegeben wird richtet sich nach Kontext und Sigil.

Default, dh kürzeste Schreibweise, ist dabei die Listenform mit dem @, das führt aber leider bei vielen Leuten zu dem Missverständnis Listen und Arrays wären in Perl Synonyme, obwohl es feine Unterschiede gibt.

>>> s = 1
  >>> t = (s, 2)
  >>> id(s)
  16790920
  >>> id(t)
  420640
  >>> id(t[0])
  16790920

analog im Perldebugger ( perl -de0)

  
  DB<1> $s=1;  
  
  DB<2> @t=(\$s,2);  # weise Array t die Liste zu  
  
  DB<3> p \$s;   #referenz zu $s  
SCALAR(0x83c5d78)  
  DB<4> p \@t;   #referenz zu @t  
ARRAY(0x83b7784)  
  DB<5> p $t[0];  
SCALAR(0x83c5d78)  

In Perl kommt man aber sehr selten auf die Idee die Referenz eines Skalars wie $s abzulegen. Das braucht man IMHO so gut wie nie.

Die Möglichkeiten sind die selben, die Defaults sind halt andere, in perl muss man explizit refrenzieren um eine Refrenz abzulegen und diese später wieder explizit derefrenzieren.

Braucht man Referenzen, kann man die Listenform umgehen und konsistent nur mit Referenzen arbeiten, der Syntax wird aber aufwändiger, weils (leider) nicht default ist.

  
  DB<6> $$s_ref=1  
  
  DB<7> $t_ref=[$s_ref,2]  
#oder:  @$t_ref=($s_ref,2)  
  DB<8> print $s_ref  
SCALAR(0x83c5e20)  
  DB<9> p $t_ref  
ARRAY(0x83c5e14)  
  DB<10> p $$t_ref[0]  
#oder:   p $t_ref->[0]  
SCALAR(0x83c5e20)  

... und Perl-Listen kann man nicht schachteln so wie Python-Tupel, sie werden immer abgeflacht. Will man Schachteln muss man Arrayrefrenzen ablegen.

  
  DB<18> @A=(1,2,3)  
  
  DB<19> @B=(4,5,6,@A)  
  
  DB<20> p @B  
456123  

Aber auch die Rückgabe mehrerer Werte funktuioniert analog zu Python-Tupel über Perl-Listen

  
  DB<21> sub func {return 1,2,3}  
  
  DB<22> ($a,$b,$c)=func()  
  
  DB<23> p $a,$b,$c  
123  

Alles nur der Vollständigkeit halber, ich denke du kennst Perl gut genug! :)

Aber ich denke für die anderen wird klar, das Python-Tupel wohl am ehesten als schachtelbare und ablegbare Perl-Listen beschrieben werden können.

Ciao
 Kurt