perl5ever has asked for the wisdom of the Perl Monks concerning the following question:

Is it possible to use prototypes (or something else) so that I can write something like this:
in_directory "/tmp", { system("..."); ... };
and have the curly braces interpreted as an anonymous sub?

It would nice not to have to write "sub" in front of the opening curly brace.

I know that I can use the (&$) prototype and put my directory parameter after the block, e.g.:

in_directory { system(...); ... } "/tmp";
I'm just wondering if there is any possible way of having it the other way around.

Replies are listed 'Best First'.
Re: block as second function argument?
by GrandFather (Saint) on Feb 21, 2011 at 05:30 UTC

    If you try to run:

    use strict; use warnings; sub proto ($&); proto 1, {};

    you get the error message:

    Type of arg 2 to main::proto must be sub {} (not anonymous hash ({})) +at noname2.pl line 7, near ";}" Execution of noname2.pl aborted due to compilation errors.

    Kinda says it all really doesn't it?

    Note that what is hard for the compiler to make sense of is often harder for people to interpret correctly. Taking away information like "This is a sub" can make it very hard to maintain code. In general don't use prototypes!

    Golfing code to reduce key strokes is almost always counter productive in terms of getting a job done.

    True laziness is hard work
      Golfing code to reduce key strokes is almost always counter productive in terms of getting a job done.
      This. A thousand times, this. Programming isn't a "twitch game" like Quake - if input speed is the biggest bottleneck for you, you're doing it wrong. :-)