Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask

Re^4: RFC: Defined-Or for before Perl 5.10

by molecules (Monk)
on Nov 10, 2010 at 20:13 UTC ( #870676=note: print w/replies, xml ) Need Help??

in reply to Re^3: RFC: Defined-Or for before Perl 5.10
in thread RFC: Defined-Or for before Perl 5.10

Thank you very much. Good call on not providing defined_or_die etc. That would be a lot of maintenance headache.

I think I will start out with just def_or and dor_call for now. Once I get copyright issues worked out at work, I'll upload to CPAN.


Replies are listed 'Best First'.
Re^5: RFC: Defined-Or for before Perl 5.10
by afoken (Abbot) on Nov 10, 2010 at 22:20 UTC

    def_or is a good name, short and quite obvious. Many computer languages use "def" as a shortcut for "define" or "defined". So, no surprises here.

    dor_call, on the other hand, is not so obvious, you have cut away too much. What the heck is "dor"? A mis-spelled door? And what would be a door-call? "Don't make me think!" def_or_call is longer, but also clearer.

    So, now that I have def_or_call(), my code will very soon look very ugly and my fingers will bleed from the many keystrokes that I need:

    # Perl >= 5.10 my $pid=fork() // die "Can't fork: $!"; # Perl < 5.9 manually my $pid=fork(); defined($pid) or die "Can't fork: $!"; # 123456789012345 # 15 extra characters # Perl < 5.9 + your module my $pid=def_or_call(fork(),sub { die "Can't fork: $!" }); # 123456789012345678 # 18 extra characters -- oops! # And you should never forget to wrap die in a sub ... # Perl < 5.9 + your module with defined_or_die # (remember to check if arguments are ALWAYS evaluated left-to-right!) # (or find a better solution ...) my $pid=def_or_die(fork(),"Can't fork: $!"); # 12345 # just 5 extra characters - 10 less than manually # and no wrapper needed

    So, I think you should really provide def(ined)_or_die and def(ined)_or_warn. Sure, it is more work than the other functions. You should really look into the Carp sources to see how they cope with the problems your module will also have. Like I said, I'm very sure that you can use Carp for the line number problem. You could load it at runtime, inside def_or_die()/def_or_warn(). Something like this:

    sub def_or_die { my ($v,$msg)=@_; return def_or_call($v,sub { require Carp; die Carp::some_magic_helper_function($msg); }); }

    And I think you should also provide their Carp equivalents, for the same reasons. You could export them on demand only, and load Carp at runtime. Something like this:

    sub def_or_carp { my ($v,$msg)=@_; return def_or_call($v,sub { require Carp; Carp::please_ignore_these_wrappers(); Carp::carp($msg); }); }

    Support for CGI::Carp would look about like this:

    sub def_or_carp { my ($v,$msg)=@_; return def_or_call($v,sub { if (exists $INC{'CGI/'}) { # CGI::Carp loaded CGI::Carp::please_ignore_these_wrappers(); CGI::Carp::carp($msg); } else { require Carp; Carp::please_ignore_these_wrappers(); Carp::carp($msg); } }); }


    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

      Fortunately we upgraded to Perl 5.14. I recommend the same to anyone considering backporting features. The only problems this has caused related to a few scripts (downloaded from CPAN in fact), that started with hard-code shebang lines such as


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://870676]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (10)
As of 2017-07-20 20:49 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (315 votes). Check out past polls.