Getopt-Long
view release on metacpan or search on metacpan
lib/Getopt/Long.pm view on Meta::CPAN
# Indices in option control info.
# Note that ParseOptions uses the fields directly. Search for 'hard-wired'.
use constant CTL_TYPE => 0;
#use constant CTL_TYPE_FLAG => '';
#use constant CTL_TYPE_NEG => '!';
#use constant CTL_TYPE_INCR => '+';
#use constant CTL_TYPE_INT => 'i';
#use constant CTL_TYPE_INTINC => 'I';
#use constant CTL_TYPE_XINT => 'o';
#use constant CTL_TYPE_FLOAT => 'f';
#use constant CTL_TYPE_STRING => 's';
use constant CTL_CNAME => 1;
use constant CTL_DEFAULT => 2;
use constant CTL_DEST => 3;
use constant CTL_DEST_SCALAR => 0;
use constant CTL_DEST_ARRAY => 1;
use constant CTL_DEST_HASH => 2;
use constant CTL_DEST_CODE => 3;
use constant CTL_AMIN => 4;
use constant CTL_AMAX => 5;
# FFU.
#use constant CTL_RANGE => ;
#use constant CTL_REPEAT => ;
# Rather liberal patterns to match numbers.
use constant PAT_INT => "[-+]?_*[0-9][0-9_]*";
use constant PAT_XINT =>
"(?:".
"[-+]?_*[1-9][0-9_]*".
"|".
"0x_*[0-9a-f][0-9a-f_]*".
"|".
"0b_*[01][01_]*".
"|".
"0[0-7_]*".
")";
use constant PAT_FLOAT =>
"[-+]?". # optional sign
"(?=\\.?[0-9])". # must start with digit or dec.point
"[0-9_]*". # digits before the dec.point
"(\\.[0-9_]*)?". # optional fraction
"([eE][-+]?[0-9_]+)?"; # optional exponent
sub GetOptions(@) {
# Shift in default array.
unshift(@_, \@ARGV);
# Try to keep caller() and Carp consistent.
goto &GetOptionsFromArray;
}
sub GetOptionsFromString(@) {
my ($string) = shift;
require Text::ParseWords;
my $args = [ Text::ParseWords::shellwords($string) ];
$caller ||= (caller)[0]; # current context
my $ret = GetOptionsFromArray($args, @_);
return ( $ret, $args ) if wantarray;
if ( @$args ) {
$ret = 0;
warn("GetOptionsFromString: Excess data \"@$args\" in string \"$string\"\n");
}
$ret;
}
sub GetOptionsFromArray(@) {
my ($argv, @optionlist) = @_; # local copy of the option descriptions
my $argend = '--'; # option list terminator
my %opctl = (); # table of option specs
my $pkg = $caller || (caller)[0]; # current context
# Needed if linkage is omitted.
my @ret = (); # accum for non-options
my %linkage; # linkage
my $userlinkage; # user supplied HASH
my $opt; # current option
my $prefix = $genprefix; # current prefix
$error = '';
if ( $debug ) {
# Avoid some warnings if debugging.
local ($^W) = 0;
print STDERR
("Getopt::Long $VERSION ",
"called from package \"$pkg\".",
"\n ",
"argv: ",
defined($argv)
? UNIVERSAL::isa( $argv, 'ARRAY' ) ? "(@$argv)" : $argv
: "<undef>",
"\n ",
"autoabbrev=$autoabbrev,".
"bundling=$bundling,",
"bundling_values=$bundling_values,",
"getopt_compat=$getopt_compat,",
"gnu_compat=$gnu_compat,",
"order=$order,",
"\n ",
"ignorecase=$ignorecase,",
"requested_version=$requested_version,",
"passthrough=$passthrough,",
"genprefix=\"$genprefix\",",
"longprefix=\"$longprefix\".",
"\n");
}
# Check for ref HASH as first argument.
# First argument may be an object. It's OK to use this as long
# as it is really a hash underneath.
$userlinkage = undef;
if ( @optionlist && ref($optionlist[0]) and
UNIVERSAL::isa($optionlist[0],'HASH') ) {
$userlinkage = shift (@optionlist);
print STDERR ("=> user linkage: $userlinkage\n") if $debug;
}
# See if the first element of the optionlist contains option
# starter characters.
# Be careful not to interpret '<>' as option starters.
if ( @optionlist && $optionlist[0] =~ /^\W+$/
&& !($optionlist[0] eq '<>'
&& @optionlist > 0
&& ref($optionlist[1])) ) {
$prefix = shift (@optionlist);
# Turn into regexp. Needs to be parenthesized!
$prefix =~ s/(\W)/\\$1/g;
$prefix = "([" . $prefix . "])";
print STDERR ("=> prefix=\"$prefix\"\n") if $debug;
}
( run in 2.434 seconds using v1.01-cache-2.11-cpan-ad19def0cd9 )