Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

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

by afoken (Abbot)
on Nov 10, 2010 at 22:20 UTC ( #870708=note: print w/replies, xml ) Need Help??

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

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". ;-)

Replies are listed 'Best First'.
Re^6: RFC: Defined-Or for before Perl 5.10
by molecules (Monk) on Feb 02, 2012 at 15:29 UTC

    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://870708]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (3)
As of 2018-04-22 09:52 GMT
Find Nodes?
    Voting Booth?