Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Grundlegende Verständnisfrage

6 views
Skip to first unread message

Oliver 'ojo' Bedford

unread,
Oct 23, 2009, 4:04:57 PM10/23/09
to
Hi!

$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

Moritz Lenz

unread,
Oct 23, 2009, 4:35:12 PM10/23/09
to

$$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/

Frank Seitz

unread,
Oct 23, 2009, 4:57:31 PM10/23/09
to
Moritz Lenz wrote:
>
> $$arref[0] ist das gleiche wie $arref->[0], und dereferenziert einfach
> eine array-referenz.

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

Moritz Lenz

unread,
Oct 24, 2009, 8:33:36 AM10/24/09
to
Frank Seitz wrote:
> Moritz Lenz wrote:
>>
>> $$arref[0] ist das gleiche wie $arref->[0], und dereferenziert einfach
>> eine array-referenz.
>
> Hä? Wie wertet Perl denn den Ausdruck aus?

Mit opcodes, genau wie jeden anderen Ausdruck.
Oder als Abkürzung für
do { my @tmp = @$arref; $tmp[0] };

Oder was meinst du?

Frank Seitz

unread,
Oct 24, 2009, 9:05:15 AM10/24/09
to
Moritz Lenz wrote:
> Frank Seitz wrote:
>> Moritz Lenz wrote:
>>>
>>> $$arref[0] ist das gleiche wie $arref->[0], und dereferenziert einfach
>>> eine array-referenz.
>>
>> Hä? Wie wertet Perl denn den Ausdruck aus?
>
> 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?

Klaus Meyer

unread,
Oct 24, 2009, 10:26:56 AM10/24/09
to
vielleicht hilft die Perl-Doku weiter:

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

Moritz Lenz

unread,
Oct 24, 2009, 10:52:43 AM10/24/09
to
Frank Seitz wrote:
> Moritz Lenz wrote:
>> Frank Seitz wrote:
>>> Moritz Lenz wrote:
>>>>
>>>> $$arref[0] ist das gleiche wie $arref->[0], und dereferenziert einfach
>>>> eine array-referenz.
>>>
>>> Hä? Wie wertet Perl denn den Ausdruck aus?
>>
>> 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?

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/

Klaus Meyer

unread,
Oct 24, 2009, 11:06:15 AM10/24/09
to
Hallo,

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

Frank Seitz

unread,
Oct 24, 2009, 11:24:05 AM10/24/09
to
Klaus Meyer wrote:
>
> 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.

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};

Frank Seitz

unread,
Oct 24, 2009, 11:38:02 AM10/24/09
to
Moritz Lenz wrote:
> Frank Seitz wrote:
>>
>> Die syntaktischen Bestandteile sind:
>>
>> $
>> $arref
>> [0]
>>
>> Wie ergibt sich daraus obige Bedeutung?
>
> 1) Man hängt vorne ein @ an
> 2) @$arref ist ein array
> 3) Wenn man ein Array indiziert, wird aus dem @ ein $
> => $$arref[0]

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 :)

0 new messages