# [Edinburgh-pm] a Perl surprise

Jeff Parsons bynari at gmail.com
Wed Jul 18 06:40:17 PDT 2012

```Uhhh, whoops, I hit send accidentally too early!

I was saying..

You said:

wtf qw(6 7 8)

is equivalent to:

wtf (('6', '7', '8'))

That's actually incorrect and wouldn't be important anyway. '6' is 6 as
a string, 6 is 6 as a number, they're not strictly the same thing.
They're not stored the same internally and perl certainly won't just
convert 6 to '6' unless you try to use 6 as a string.

The simple answer as to why what happens happens is internally, by
prototyping with a scalar you're just causing a

\$_[0] = qw(6 7 8) to happen.

Hope I was clear in my explanation!

Regards,
Geoff

On 18/07/2012 14:15, Nick wrote:
> Here's a little off-topic on-topicality to clutter the list up.  Excuse me for
> served my purpose at least), and I figure I may as well send this.
>
>
> What would you expect this to print?
>
>     perl -le ' sub wtf(\$) { @_ }; @a = wtf qw(6 7 8); print @a;'
>
> 6 right?
>
> Nope.
>
>
>
> Let's see what Deparse says:
>
>     perl -MO=Deparse -le ' sub wtf(\$) { @_ }; @a = wtf qw(6 7 8); print @a;'
>
>   BEGIN { \$/ = "\n"; \$\ = "\n"; }
>   sub wtf (\$) {
>       @_;
>   }
>   @a = wtf(('???', '???', '8'));
>   print @a;
>
>
> WTF are those '???' things?  Discarded constants I suppose?
>
>
> Anyway, seems that the reason for the surprise is that in this case (with a
> prototype):
>
>    wtf qw(6 7 8)
>
> is equivalent to:
>
>    wtf (('6', '7', '8'))
>
>
>
> A list (as opposed to an array) in scalar context evaluates the to *last*
>
>    perl -le 'sub wtf { my @a = 6, 7, 8; @a }; print wtf;' # -> 6
>
>
>    perl -le 'sub wtf { my \$a = (6, 7, 8); \$a }; print wtf;' # -> 8
>
> Note the (absense of) brackets.
>
>
>
> At least if you turn warnings on you will get a warning about "useless use of a
> constant".
>
>
>
> N
> _______________________________________________
> Edinburgh-pm mailing list
> Edinburgh-pm at pm.org
> http://mail.pm.org/mailman/listinfo/edinburgh-pm

```