right - isn't the 10 in the return 10, 20; statement being evaluated in a void context then? And so shouldn't it trigger a warning? | [reply] [d/l] |
No, the expression is 10, 20 and it as a whole is evaluated in scalar context
Obvious mistakes (from Useless use of %s in void context )
- $foo = 1, 2;
- Useless use of a constant (2) in void context at -e line 1 (#1)
assignment(=) binds tighter than comma(,) so $foo is 1 $ perl -MO=Deparse,-p -e " $foo = 1, 2; "
(($foo = 1), '???');
-e syntax OK
- $one, $two = 1, 2;
- Useless use of a variable in void context at -e line 1 (#1)
$ perl -MO=Deparse,-p -e " $one, $two = 1, 2; "
($one, ($two = 1), '???');
-e syntax OK
- Another obvious one: $one, $two = foo();
- Useless use of private variable in void context at -e line 1 (#1)
$ perl -MO=Deparse,-p -e " sub foo { 1, 2 } $one, $two = foo(); "
sub foo {
(1, 2);
}
($one, ($two = foo()));
-e syntax OK
Since the behavior of comma operator in list/scalar context is well defined,
since the behaviour of a list in scalar/list context is well defined (see If you believe in Lists in Scalar Context, Clap your Hands ),
perl doesn't warn about : $two = foo();
because it is predictable/guaranteed/you're expected to know what it means
sub foo{1,2} ($f)= foo(); is like ($f) = (1,2); # no warn, $f is 1
sub foo{1,2} $f = foo(); is like $f = (1,2); # no warn, $f is 2
perl won't warn you, scalar context guarantees rightest most(last), list context guarantees leftest most (first)
| [reply] [d/l] [select] |
I meant the "returned expression" not the "return statement"!
it's effectively
return scalar(10,20);
so no warning
DB<100> print scalar (10,20)
20
UPDATE: maybe the following is clearer,
DB<113> sub tst { 2..10 }
=> 0
DB<114> ($a)=tst()
=> 2
DB<115> $a=tst()
=> ""
DB<116> sub tst { /2/../10/ }
=> 0
DB<117> $_=2
=> 2
DB<118> $a=tst()
=> 1
DB<119> $a=tst()
=> 2
DB<120> $_=10
=> 10
DB<121> $a=tst()
=> "3E0"
as you can see the range-op transforms to flip-flop-op in scalar context.
So we are not returning a list but an expression which is evaluated according to the callers context.
| [reply] [d/l] [select] |
that makes sense! thank you very much, Rolf.
-Ed
| [reply] |