in reply to Re: no expected 'Useless use of a constant in void context' warning for expression in return statement
in thread no expected 'Useless use of a constant in void context' warning for expression in return statement

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?
  • Comment on Re^2: no expected 'Useless use of a constant in void context' warning for expression in return statement
  • Download Code

Replies are listed 'Best First'.
Re^3: no expected 'Useless use of a constant in void context' warning for expression in return statement
by Anonymous Monk on Dec 15, 2012 at 05:03 UTC

    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)

Re^3: no expected 'Useless use of a constant in void context' warning for expression in return statement
by LanX (Saint) on Dec 15, 2012 at 05:35 UTC
    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.

    Cheers Rolf

      that makes sense! thank you very much, Rolf. -Ed