Listenkontext im Skalarkontext erzwingen
Listenkontext im Skalarkontext erzwingen
am 24.04.2006 20:38:07 von Erkan Yanar
Bei einem Skalar als lvalue und einer Liste als rvalue "zerfällt" die
Liste und im Skalar wird das letzte Element der Liste abgespeichert.
$sk=map {$_ *2} 1 .. 10;
Ist es möglich die Rückgabe von map in einen Listenkontext zu sperren,
so daß unter $sk 20 abgespeichert wird?
P.S.: Ich meine nicht so was wie:
$sk=(map {$_ *2} 1 .. 10)[-1];
tschazu
erkan
Re: Listenkontext im Skalarkontext erzwingen
am 24.04.2006 21:17:18 von Paul Hink
Erkan Yanar wrote:
> Bei einem Skalar als lvalue und einer Liste als rvalue "zerfällt" die
> Liste und im Skalar wird das letzte Element der Liste abgespeichert.
>
> $sk=map {$_ *2} 1 .. 10;
>
> Ist es möglich die Rückgabe von map in einen Listenkontext zu sperren,
> so daß unter $sk 20 abgespeichert wird?
>
> P.S.: Ich meine nicht so was wie:
> $sk=(map {$_ *2} 1 .. 10)[-1];
Was genau stört dich an dieser Möglichkeit?
Paul
Re: Listenkontext im Skalarkontext erzwingen
am 24.04.2006 22:41:05 von Erkan Yanar
Paul Hink schrieb:
> Erkan Yanar wrote:
>
>> Bei einem Skalar als lvalue und einer Liste als rvalue "zerfällt" die
>> Liste und im Skalar wird das letzte Element der Liste abgespeichert.
>>
>> $sk=map {$_ *2} 1 .. 10;
>>
>> Ist es möglich die Rückgabe von map in einen Listenkontext zu sperren,
>> so daß unter $sk 20 abgespeichert wird?
>>
>> P.S.: Ich meine nicht so was wie:
>> $sk=(map {$_ *2} 1 .. 10)[-1];
>
> Was genau stört dich an dieser Möglichkeit?
>
Ich gebe dabei direkt ein Skalar rüber. Ich will aber eine Liste stehen
haben, die "zerfällt".
tschazu
erkan
Re: Listenkontext im Skalarkontext erzwingen
am 24.04.2006 22:49:34 von Ch Lamprecht
Erkan Yanar schrieb:
> Bei einem Skalar als lvalue und einer Liste als rvalue "zerfällt" die
> Liste und im Skalar wird das letzte Element der Liste abgespeichert.
In diesem Fall gibt es gar keine Liste:
perldoc -q list:
....
As a side note, there's no such thing as a list in scalar context. When
you say
$scalar = (2, 5, 7, 9);
you're using the comma operator in scalar context, so it uses the scalar
comma operator. There never was a list there at all! This causes the
last value to be returned: 9.
> $sk=map {$_ *2} 1 .. 10;
>
> Ist es möglich die Rückgabe von map in einen Listenkontext zu sperren,
> so daß unter $sk 20 abgespeichert wird?
Du kannst dir den Komma-Operator herbeischaffen, damit du dieses
Ergebnis bekommst:
my $list = join (',',map {$_ *2} 1 .. 10);
print scalar eval "$list";
Aber so hattest du dir das sicher auch nicht vorgestellt ;)
Grüße, Christoph
--
perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"
Re: Listenkontext im Skalarkontext erzwingen
am 24.04.2006 23:25:58 von Erkan Yanar
Ch Lamprecht schrieb:
> Erkan Yanar schrieb:
>> Bei einem Skalar als lvalue und einer Liste als rvalue "zerfällt" die
>> Liste und im Skalar wird das letzte Element der Liste abgespeichert.
> In diesem Fall gibt es gar keine Liste:
> perldoc -q list:
>
> ...
> As a side note, there's no such thing as a list in scalar context. When
> you say
>
> $scalar = (2, 5, 7, 9);
>
> you're using the comma operator in scalar context, so it uses the scalar
> comma operator. There never was a list there at all! This causes the
> last value to be returned: 9.
>
hmm snüff danke
>
>> $sk=map {$_ *2} 1 .. 10;
>>
>> Ist es möglich die Rückgabe von map in einen Listenkontext zu sperren,
>> so daß unter $sk 20 abgespeichert wird?
>
> Du kannst dir den Komma-Operator herbeischaffen, damit du dieses
> Ergebnis bekommst:
>
> my $list = join (',',map {$_ *2} 1 .. 10);
> print scalar eval "$list";
>
> Aber so hattest du dir das sicher auch nicht vorgestellt ;)
>
nope, aber coole Idee.
tschazu
erkan
Re: Listenkontext im Skalarkontext erzwingen
am 25.04.2006 12:17:31 von Lukas Mai
Erkan Yanar schrob:
> Bei einem Skalar als lvalue und einer Liste als rvalue "zerfällt" die
> Liste und im Skalar wird das letzte Element der Liste abgespeichert.
Nein. Es gibt keine Listen in skalarem Kontext.
> $sk=map {$_ *2} 1 .. 10;
Was hier passiert, hängt allein von map ab.
perldoc -f map:
...
In scalar context, returns the total number of elements so generated.
...
> Ist es möglich die Rückgabe von map in einen Listenkontext zu sperren,
> so daß unter $sk 20 abgespeichert wird?
>
> P.S.: Ich meine nicht so was wie:
> $sk=(map {$_ *2} 1 .. 10)[-1];
($sk) = map $ * 2, (1 .. 10)[-1]; # :-)
HTH, Lukas
Re: Listenkontext im Skalarkontext erzwingen
am 25.04.2006 12:26:45 von Mirco Wahab
Hallo Erkan
> Bei einem Skalar als lvalue und einer Liste als rvalue "zerfällt" die
> Liste und im Skalar wird das letzte Element der Liste abgespeichert.
>
> $sk=map {$_ *2} 1 .. 10;
>
> Ist es möglich die Rückgabe von map in einen Listenkontext zu sperren,
> so daß unter $sk 20 abgespeichert wird?
>
> P.S.: Ich meine nicht so was wie:
> $sk=(map {$_ *2} 1 .. 10)[-1];
Ist es, aber imho hier nur "indirekt", siehe z.B.
#!/usr/bin/perl -w
$sk = \map {$_ *2} 1 .. 10;
print $$sk, "\n"; # ${$s} == 20
# wegen:
($s) = ('a', 'b', 'c');
print "s= $s\n"; # ==> a
$s = ('a', 'b', 'c');
print "s= $s\n"; # ==> c
$s = \('a', 'b', 'c');
print "s= $$s\n"; # ==> c
"every problem can be solved by adding a level of indirection"
(z.B. http://www.relisoft.com/book/lang/index.htm)
Viele Grüße
M.