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.