Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^3: "last expression" quiz

by bart (Canon)
on Oct 19, 2005 at 22:27 UTC ( [id://501456]=note: print w/replies, xml ) Need Help??


in reply to Re^2: "last expression" quiz
in thread "last expression" quiz

A for loop typically returns nothing, whatever that means...

Judging by your results on the warnings, or rather the lack of them, I think the subs return false, thus, !1. That is both equal to "" and numerically equal to 0 without a warning.

Oh, and a 1 is allowed to be used as a statement without warning. Typical use for them is in a bodyless loop:

1 while COND;
as well as as the last statement in a required file/module. Hence that there's no warning for a bare 1;.

Replies are listed 'Best First'.
Re^4: "last expression" quiz
by Aristotle (Chancellor) on Oct 19, 2005 at 22:32 UTC

    Actually, a for loop does return something. Assuming it runs at least once, it will return an empty string, alias scalar false.

    There seems to be no particular reason for that behaviour.

    Makeshifts last the longest.

      Actually, bart is saying it returns !1 which is really scalar false. It is subtly different than "" as can be seen here:

      $ perl -wle 'print "yes" if !1 == 0 ' yes $ perl -wle 'print "yes" if "" == 0 ' Argument "" isn't numeric in numeric eq (==) at -e line 1. yes

      -sauoq
      "My two cents aren't worth a dime.";
      
        The difference is more visible this way:
        use Devel::Peek; Dump(""); Dump(!1);
        The output of which is
        SV = PV(0x816d944) at 0x8163c48
          REFCNT = 1
          FLAGS = (PADBUSY,PADTMP,POK,READONLY,pPOK)
          PV = 0x8167830 ""\0
          CUR = 0
          LEN = 1
        SV = PVNV(0x814d6a0) at 0x814c600
          REFCNT = 2147483647
          FLAGS = (PADBUSY,PADTMP,NOK,POK,READONLY,pNOK,pPOK)
          IV = 0
          NV = 0
          PV = 0x814d678 ""\0
          CUR = 0
          LEN = 1
        

        Jeff japhy Pinyan, P.L., P.M., P.O.D, X.S.: Perl, regex, and perl hacker
        How can we ever be the sold short or the cheated, we who for every service have long ago been overpaid? ~~ Meister Eckhart

        Ah, interesting; I guess Perl DWIMs this so well I had never paid enough attention to notice the subtlety. Reminds me of the games some people played elsewhere on the Monastery quite a while ago with scalars that had specific, different values when evaluated as numbers or as strings (without overloading, if memory serves). (Alas, I cannot remember any useful keywords to Super Search it.)

        Makeshifts last the longest.

Re^4: "last expression" quiz
by Aristotle (Chancellor) on Oct 19, 2005 at 22:58 UTC

    Oh, and another thing: you can use either 0 or 1 as a constant in void context without getting a warning, but you can also use any string that starts with "ig", "ds", or "di", as Dominus famously demonstrated.

    Makeshifts last the longest.

Re^4: "last expression" quiz
by sauoq (Abbot) on Oct 19, 2005 at 22:44 UTC
    as well as as the last statement in a required file/module.

    Well, you can use whatever you want as the last statement of a required module without getting the "Useless use of a constant in void context" warning.

    -sauoq
    "My two cents aren't worth a dime.";
    
      True, if you actually require the file. That probably is because then, the last statement isn't called in void context.

      But you do get the warning if you try to test such a module for syntax errors using perl -wc FILE. Unless you actually use 1.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://501456]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2024-03-28 19:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found