目前無法理解的命令行處理

#!/usr/bin/env perl
use warnings;
use strict;

use Getopt::Long qw(:config gnu_getopt);

my %options = (
        'help' => +{spec => 'help|?|h', value => undef },
        # default output is "short" options
        'long' => +{spec => 'long-options|l!', value => undef },
        # count of options printed each line
        'width' => +{spec => 'width|w=i', value => 4},
        # verbose mode, report each option hit as scanning
        'verbose' => +{spec => 'verbose|v!', value => 0},
        # dummy option
        'option1' => +{spec => 'option1|o=s', value => undef},
);
GetOptions(
        map {;
                $options{$_}{spec} =>
                        (ref($options{$_}{value}) ? $options{$_}{value} : \$options{$_}{value});
        } keys(%options)
);
if ($options{help}{value}) { usage(); }

## 這裏是要特殊處理的地方
if (defined($options{option1}{value})) {
        my @items = split '\s*,\s*', $options{option1}{value};
        $options{option1}{value} = \@items;
}

### option dumping
print "Your options:\n";
foreach (keys(%options)) {
        printf "  %s: %s\n", $_, argument_value($options{$_}{value});
}

exit 0;

sub argument_value {
        my ($val) = @_;
        unless (defined($val)) {
                return '<undef>';
        }
        if (ref($val)) {
                if (ref($val) eq 'ARRAY') {
                        return "[" . join(" ", @$val) . "]";
                } else { ## ignore other types
                        return "<UNKNOWN>";
                }
        } else {
                # scalar
                return $val;
        }
}

sub usage {
        (my $PROG = $0) =~ s/^.*\///;
        print <<EOF;
USAGE
        $PROG OPTIONS

OPTIONS:
           -l, --long                Long options switch
           -w, --width=N             Number of options to print each line
           -h, --help                This help screen

COPYRIGHT
           (C) 2010 XXX XXXXXXX, <XXX\@gmail.com>
EOF
        exit 1;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章