[Melbourne-pm] $0 manipulation
Mathew Robertson
mathew.blair.robertson at gmail.com
Thu Aug 30 22:15:46 PDT 2012
Hi List,
I had a scenario recently where 'pod2usage' was failing (ref: Pod::Usage)
when used in conjunction with a GetOptions call -> the code went something
like this:
my $man = 0;
my $help = 0;
my $cmd = "";
GetOptions(
'help|h|?' => \$help,
man => \$man,
"cmd=s" => \$cmd,
) or pod2usage(2);
pod2usage(0) if $help;
pod2usage(-exitstatus => 0, -verbose => 2) if $man;
pod2usage(2) unless $cmd;
Now call "blah.pl --help" and I get an error on the ...if $help line
number.
So drilling into it further, I identify that the problem is related to how
I am manipulating $0 to also show automatically my command line arguments,
and how Pod::Usage attempts to read from $0. Thus depending on the order
in which you call pod2usage vs manipulate $0, you may or may not get an
error.
Some further reading of the perlvar doc says that manipulating $0 to status
information, is a normal thing.... Looking at FindBin, etc al also shows
that $0 is consulted (at call-time) for its current value.
I have posted previously some discussion on the use of $0 (eg: pidof
somescript.pl vs killall somescript.pl) -> where that discussion depended
on your point of view.
However, this one seems somewhat contradictory -> to my eyes, either $0
should contain a somewhat non-updatable pointer to the location of the
script, *or* you can update its value to show the current script-status,
but then cause your tools to break. Obviously there are workarounds, such
as monkey patching FindBin, pos2usage, etc, but that gets somewhat
cumbersome. And I dont recall there being a separate variable (other than
$0), which holds the path to the executing script.
So how do I update $0 to show script status, but also to have pod2usage,
FindBin, etc do the right thing?
I dont expect an easy answer to this... other than:
a) wont fix
b) use some variation of another variable ** to fix either the CPAN
modules, or script status.
** I vote $^0... I dont think it is being used, and it follows both the $0
= name and $^ = internal-var convention.
Thoughts?
Mathew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/melbourne-pm/attachments/20120831/2ec4a8d7/attachment.html>
More information about the Melbourne-pm
mailing list