Неизвестные параметры Perl Getopt::Long

Как узнать неизвестные параметры с помощью Getopt::Long ?

Я попробовал '‹>', но это не сработало, как ожидалось. Рассмотрим:

use Modern::Perl;
use Getopt::Long;

my $help='';
GetOptions ('help' => \$help,'<>' => \&usage);
usage() if $help;

usage() if @ARGV != 1;

my $fn=pop;

say "FileName: $fn";

sub usage {
    say "Unknown option: @_" if ( @_ );
    say "Usage: $0 <filename>";
    say "       $0 --help";
    say "";
    exit
}

Я хотел бы напечатать Unknown option только в том случае, если есть нераспознанный параметр (в данном случае что-то другое, чем --help). Но теперь он думает, что имя файла является непризнанным вариантом.


person Håkon Hægland    schedule 25.03.2014    source источник
comment
Вы говорите, что хотите напечатать Unknown option для таких вещей, как --foo или -foo, но рассматривать foo как имя файла?   -  person ThisSuitIsBlackNot    schedule 25.03.2014


Ответы (2)


Вызовите свою функцию usage в случае сбоя GetOptions. Getopt::Long напечатает для вас Unknown option (в STDERR):

use Modern::Perl;
use Getopt::Long;

my $help='';
GetOptions ('help' => \$help) or usage();
usage() if $help;

usage() if @ARGV != 1;

my $fn=pop;

say "FileName: $fn";

sub usage {
    say "Usage: $0 <filename>";
    say "       $0 --help";
    say "";
    exit
}
person toolic    schedule 25.03.2014

Начните использовать документацию модуля в качестве основных модулей Getopt::Long и Pod::Usage очень хорошо работают вместе. Может получить желаемое поведение без необходимости создавать вспомогательные методы для его выполнения:

Вот пример скрипта:

#!/usr/bin/perl

use File::Basename qw(basename);
use Getopt::Long qw(GetOptions);
use Pod::Usage qw(pod2usage);
use Readonly;
use version;

use strict;
use warnings;

Readonly my $VERSION => qv('0.0.1');
Readonly my $EXE => basename($0);

GetOptions(
    'version'   => \my $version,
    'usage'     => \my $usage,
    'help|?'    => \my $help,
    'man'       => \my $man,
) or pod2usage(-verbose => 0);
pod2usage(-verbose => 0) if $usage;
pod2usage(-verbose => 1) if $help;
pod2usage(-verbose => 2) if $man;

if ($version) {
    print "$EXE v$VERSION\n";
    exit;
}

## Check for File
pod2usage("$EXE: No filename specified.\n") unless @ARGV;

my $file = $ARGV[0];
pod2usage("$EXE: $file is a directory.\n") if -d $file;
pod2usage("$EXE: $file is not writable.\n") if !-w $file;


#....
print "Hello World\n";
#....

1;

__END__

=head1 NAME

hello.pl - Mirrors a script using pod

=head1 SYNOPSIS

./hello.pl [FILE]


=head1 OPTIONS

=over 4

=item --version

Print the version information

=item --usage

Print the usage line of this summary

=item --help

Print this summary.

=item --man

Print the complete manpage

=back


=head1 DESCRIPTION

Sometimes a programmer just enjoys a bit of documentation.
They can't help themselves, it makes them feel accomplished.

=head1 AUTHOR

Written by A Simple Coder

Вывод:

>perl hello.pl --test
Unknown option: test
Usage:
    ./hello.pl [FILE]
person Miller    schedule 25.03.2014
comment
+1 Спасибо! Я начинаю изучать Perl, поэтому я не знал о документации POD. Кажется, это здорово. - person Håkon Hægland; 26.03.2014