Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re^2: Spotting an empty array as argument

by Chuma (Scribe)
on Mar 25, 2021 at 21:01 UTC ( [id://11130340]=note: print w/replies, xml ) Need Help??


in reply to Re: Spotting an empty array as argument
in thread Spotting an empty array as argument

Right, I suspected there might not be any nice way of doing it. I mean, "say" does seem to do some magic in the "no argument" case, just like "print", since it treats it differently from the "empty array" case. But maybe that's just a special rule for built-in functions.

It's weird though, because there are so many built-in functions that have the same behaviour, defaulting to $_ if there are no arguments, and it's clearly useful, so it's surprising if there's no way of recreating that for your own functions.

  • Comment on Re^2: Spotting an empty array as argument

Replies are listed 'Best First'.
Re^3: Spotting an empty array as argument
by choroba (Cardinal) on Mar 25, 2021 at 21:39 UTC
    The prototype (_) can be used for the last argument. Some builtin functions can't be simulated, though, you can detect them by prototype('CORE::func') returning undef.

    For example, you can easily replicate the behaviour of uc, as prototype('CORE::uc') returns _. Similarly, pack has the prototype of $_ (the underscore must be the last one). But print or chomp return undef, so their behaviour is more complex and prototypes can't express it. So there is a special rule, but only for some of the built-in functions.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]

      While prototype would normally be a useful thing to try, say can't be prototyped because it supports say FH ..., so a definitive answer can't be obtained from prototype here (assuming the lack of file handle support is acceptable).

      Seeking work! You can reach me at ikegami@adaelis.com

        > say can't be prototyped because it supports say FH ...,

        I can't follow, the fact that say is internally calling something like FH->print(@_,"\n") shouldn't have any consequence on the prototype.

        Hmmm ...

        I think what you mean is that this inhibits attempts to override say with another implementation, since it needs to act like an indirect method call, but with prototype magic.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

      > (the underscore must be the last one)

      FWIW, the last of the mandatory ones!

      I.e. you can define following prototypes as long as they are marked optional with a semicolon.

      Trouble here is the scalar context!

      DB<237> sub tst (_;@) { dd \@_ } DB<238> $_=666; @a='a'..'c'; $a='A' DB<239> tst [666] DB<240> tst $a,1,2,3 ["A", 1, 2, 3] DB<241> tst $a,@a ["A", "a", "b", "c"] DB<242> tst @a # OOPS [3]

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (5)
As of 2024-04-18 13:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found