Как использовать GetOptions для обнаружения конечных строк?

Я абсолютно новичок в Perl, и я пытаюсь выяснить проблему с разбором аргументов скрипта Perl-скрипта.

У меня есть следующий сценарий Perl с именем sample-perl.pl:

use strict;
use warnings;
use 5.010;
use Getopt::Long qw(GetOptions);

my $source_address;
my $dest_address;

GetOptions('from=s' => \$source_address,
           'to=s' => \$dest_address) or die "Usage: $0 --from NAME --to NAME\n";
if ($source_address) {
    say $source_address;
}

if ($dest_address) {
    say $dest_address;
}

И если я использую команду типа (где я забыл ввести второй вариант):

perl sample-perl.pl --from nyc lon
Output will be: nyc

Как я могу обеспечить, чтобы, если в конце есть дополнительная строка, она обнаруживалась, и вместо этого отображалась ошибка?

Решение:

добавление этого поможет моему делу, по крайней мере:

if(@ARGV){
    //throw error
}

person abhishek    schedule 06.04.2017    source источник
comment
Проверить scalar @ARGV ? Если @ARGV > 0 есть (не опциональные) аргументы, не полученные GetOptions() в командной строке   -  person Håkon Hægland    schedule 06.04.2017
comment
@HåkonHægland похоже на то. Хотел бы я принять этот ответ :)   -  person abhishek    schedule 06.04.2017


Ответы (2)


После вызова GetOptions проверьте наличие оставшихся параметров командной строки в массиве @ARGV. Это предполагает, что все неожиданные аргументы будут генерировать ошибку:

use strict;
use warnings;
use 5.010;
use Getopt::Long qw(GetOptions);

my $source_address;
my $dest_address;

GetOptions('from=s' => \$source_address,
           'to=s' => \$dest_address) or die "Usage: $0 --from NAME --to NAME\n";

@ARGV and die "Error: unexpected args: @ARGV";

if ($source_address) {
    say $source_address;
}

if ($dest_address) {
    say $dest_address;
}
person toolic    schedule 06.04.2017

Я был занят ответом, и я вижу, что на него уже ответили, просто немного дополнительной информации.

use strict;
use warnings;
use 5.010;
use Getopt::Long qw(GetOptions);

my $source_address;
my $dest_address;

GetOptions('from=s' => \$source_address,
       'to=s' => \$dest_address) or die "Usage: $0 --from NAME --to NAME\n";

@ARGV and die "To many arguments after --from or --to : @ARGV ";

if ($source_address) {
say $source_address;
} else {
say "Error: No Source specified"; #Check to see if --from is actually specified, else print error.
}

if ($dest_address) {
say $dest_address;
} else {
say "Error: No destination specified"; #Check to see if --to is actually specified, else print error.
}

так короче

person Gerhard    schedule 06.04.2017
comment
Почему вы печатаете Error, если --from не используется? Это вариант. То же самое для --to. - person toolic; 06.04.2017
comment
но использование конкретно говорит, что должно быть или die "Usage: $0 --from NAME --to NAME\n";, что говорит мне, что вам нужны оба варианта. как, например, расчет расстояния от и до. - person Gerhard; 06.04.2017
comment
Ваш ответ правильный и помечен как таковой, я просто добавил дополнительные вещи, которые имели для меня смысл :) - person Gerhard; 06.04.2017