$arref = [ "eins", "zwei", "drei" ];
print $arref," \n";
print @$arref," \n";
print @$arref[0]," \n";
print $$arref[0]," \n";
print @$arref->[0]," \n";
Ausgabe:
ARRAY(0x9c9df0)
einszweidrei
eins
eins
eins
Was ist der Unterschied zwischen den letzten drei Varianten?
TIA,
Oliver
$$arref[0] ist das gleiche wie $arref->[0], und dereferenziert einfach
eine array-referenz.
@$arref[0] ist eine Array-Slice mit einem Element. Der Unterschied ist
der Kontext:
sub context { print wantarray ? "list\n" : "scalar\n" };
@$arref[0] = context();
$$arref[0] = context();
Die Variante ist ein altes Relikt, und warnt, wenn du perl mit der
Optioin -w startest (oder use warnings; benutzt):
Using an array as a reference is deprecated at foo.pl line 7.
Mehr dazu findest du in folgenden Perldoc-Dokumenten:
perlreftut, perlref, perldsc, perldata
Grüße,
Moritz
--
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/
Hä? Wie wertet Perl denn den Ausdruck aus?
Grüße
Frank
--
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Homepage: http://www.fseitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2
Mit opcodes, genau wie jeden anderen Ausdruck.
Oder als Abkürzung für
do { my @tmp = @$arref; $tmp[0] };
Oder was meinst du?
Ich meine die Semantik, die sich aus den syntaktischen
Bestandteilen des Ausdrucks herleiten lassen sollte.
Die syntaktischen Bestandteile sind:
$
$arref
[0]
Wie ergibt sich daraus obige Bedeutung?
http://perldoc.perl.org/perlref.html#Using-References
Oder aus perlreftut:
you can omit the curly brackets whenever the thing inside them is an atomic
scalar variable like $aref . For example, @$aref is the same as @{$aref} ,
and $$aref[1] is the same as ${$aref}[1] .
--
Grüße
Klaus
1) Man hängt vorne ein @ an
2) @$arref ist ein array
3) Wenn man ein Array indiziert, wird aus dem @ ein $
=> $$arref[0]
In Perl 6 ist das ein wenig intuitiver, da ist das Sigil beim indizieren
invariant, und man kann auch auf Referenzen direkt mit dem Index zugreifen:
$ perl6 -e 'my $a = [3, 4, 5]; say $a[2]'
5
--
Moritz Lenz
http://perl6.org/ http://perlgeek.de/
ich hänge mich hier mal ran, weil ich eine in etwa ähnliche Frage habe:
Diese beiden Zeilen ergeben im print einen Syntax-Fehler:
my %hx = ( Daten => 1 );
print {%hx};
Ich hätte erwartet, der print würde das anonyme Hash ausgeben, etwa so:
HASH(0x1845cd4)
Ändere ich die print-Zeile etwas, zB so
print "",{%hx};
kommt kein Syntax-Fehler mehr.
Auch diese Version funktioniert:
print {},{%hx};
Aber so herum gibt es wieder den Syntax-Fehler:
print {%hx},{};
Ich kann mir das Verhalten nicht so recht erklären. Aber vielleicht gibt es
eine verständliche Erklärung?
--
Grüße
Klaus
Da kann ich weiterhelfen.
Das liegt daran, dass Perl die geschweiften Klammern in dem Fall nicht
als anonymen Hash, sondern als Block interpretiert.
Siehe perldoc -f print, am Ende.
Du kannst Perl durch ein vorangestelltes + veranlassen, die andere
Interpretation zu wählen:
print +{%hx};
Danke, bin ich nicht drauf gekommen.
Es ist hinsichtlich der Sigil-Tauscherei konsequent. Aber
ich denke, kein normaler Mensch schreibt es so.
> In Perl 6 ist das ein wenig intuitiver, da ist das Sigil beim indizieren
> invariant, und man kann auch auf Referenzen direkt mit dem Index zugreifen:
>
> $ perl6 -e 'my $a = [3, 4, 5]; say $a[2]'
> 5
Ja, in Perl 6 wird alles (noch) besser.
In Perl 5 lautet die äquivalente Formulierung $a->[2], was auch ok ist :)