note
grinder
<p>I have no problems with the anonymous sub. I do take issue, though, with the list of scalars for options. I much prefer to use a hash to keep things in one place.</p>
<p>But hang on! If you mispell a scalar, the compiler will bark at you. If you mispell a hash key, the runtime will autovivify it for you. Hmm.</p>
<p>But that's ok too, because what I <i>really</i> prefer doing is hiding it all away in a scope, and declaring subs as The Only Way of retrieving values. Admittedly, you still don't get a compile time error, but it will blow up at runtime if you get things worng. My template looks something like:</p>
<code>
{
use Getopt::Long;
my %opt;
GetOptions (
\%opt,
qw/ verbose! file:s debug+ help/
) || die sub { print <<END_OF_HELP;
$0: you blew it! Switches are as follows:
--help | -h this help screen
...
END_OF_HELP
}
sub debug { exists $opt{debug} ? $opt{debug} : 0 }
sub verbose { exists $opt{verbose} ? 1 : 0 }
sub file {
if( not exists $opt{f} ) {
''
}
elsif( not defined $opt{f} ) {
'/etc/passwd'
}
else {
$opt{f}
}
}
}
</code>
<p>The sub <tt>file</tt> lets you distinguish between an argument that is absent (return an empty string), present, but with no value (return a fixed name) or present with a value (return the value).</p>
<p>Since the %opt hash isn't available outside the scope, the program can't (accidentally or on purpose) modify the contents. This may be construed as a feature.</p>
<div class="pmsig"><div class="pmsig-29008">
<p align="right"><font size="-2">- another intruder with the mooring of the heat of the Perl</font></p>
</div></div>
377971
377971