【问题标题】:How to use GetOptions to detect trailing strings?如何使用 GetOptions 检测尾随字符串?
【发布时间】:2017-04-06 12:56:26
【问题描述】:

我对 Perl 完全陌生,我正在尝试找出 Perl 脚本解析脚本参数的问题。

我有以下名为 sample-perl.pl 的 Perl 脚本:

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
}

【问题讨论】:

  • 检查scalar @ARGV ?如果@ARGV > 0 有(非选项)参数未被GetOptions() 在命令行中拾取
  • @HåkonHægland 好像是这样。我希望我能接受这个答案:)

标签: perl getopt getopt-long


【解决方案1】:

调用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;
}

【讨论】:

    【解决方案2】:

    我正忙着回答,我看到它现在已经回答了,只是一些附加信息。

    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.
    }
    

    简而言之

    【讨论】:

    • 如果不使用--from,为什么要打印Error?这是一种选择。 --to 也一样。
    • 但用法特别说明必须是或die "Usage: $0 --from NAME --to NAME\n";,这告诉我您需要这两个选项。例如计算往返距离。
    • 你的答案是正确的,并被标记为这样,我只是添加了对我有意义的额外内容:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多