如何验证在Pe​​rl中使用Getopt :: Long读取了哪些标志?

时间:2010-09-07 11:45:18

标签: perl command-line-arguments getopt-long

  

myscript.pl

my $R;
my $f1 = "f1.log";
my $f2 = "f2.log";
my $f3 = "f3.log";

sub checkflags {

    GetOptions('a=s'    => \$f1,
               'b=s'    => \$f2,
               'c=s'    => \$f3,
    );

    open $R, '>', $f1 or die "Cannot open file\n"; # Line a
}
  • 所有标志都是可选的。

  • 如果我将脚本称为

    perl myscript.pl -a=filename
    

    我需要在.log打开文件名后附加Line a

  • 为此我需要知道GetOptions是否将某些内容读入$f1

如何做到这一点?

4 个答案:

答案 0 :(得分:2)

最简单的解决方案是在/[.]log$/中查找$f1,如果不存在则添加它。不幸的是,这意味着当用户通过"foo.log"并希望它成为"foo.log.log"时它不会,但我认为我们可以同意用户是一个混蛋。

一个更好的选择,让混蛋感到高兴,是:

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

GetOptions(
    'a=s'    => \my $f1,
    'b=s'    => \my $f2,
    'c=s'    => \my $f3,
);

if (defined $f1) {
    $f1 .= ".log";
} else {
    $f1 = "f1.log";
}

print "$f1\n";

如果要在顶部定义所有默认名称,请使用其他变量来执行此操作(无论如何都可能更好地读取代码):

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;

my $default_f1 = "f1.log";
my $default_f2 = "f2.log";
my $default_f3 = "f3.log";

GetOptions(
    'a=s'    => \my $f1,
    'b=s'    => \my $f2,
    'c=s'    => \my $f3,
);

if (defined $f1) {
    $f1 .= ".log";
} else {
    $f1 = $default_f1;
}

print "$f1\n";

答案 1 :(得分:1)

if (defined $f1) {
  # You got a -a option
}

但我个人更喜欢read the options into a hash然后使用exists()。

答案 2 :(得分:1)

$f1 = "$f1.log" unless $f1 =~ m/\.log$/i;

如果文件名尚未包含,则附加 log 扩展名。由于默认值以 log 结尾,因此没有任何反应。如果用户在命令行上键入 log ,它就可以工作。

答案 3 :(得分:0)

实现此目的的一种方法是使用MooseMooseX::Getopt

package MyApp;

use strict;
use warnings;

use Moose;
with 'MooseX::Getopt';

has f1 => (
    is => 'ro', isa => 'Str',
    cmd_aliases => 'a',
    default => 'f1.log',
    predicate => 'has_a',
);
has f2 => (
    is => 'ro', isa => 'Str',
    cmd_aliases => 'b',
    default => 'f2.log',
    predicate => 'has_b',
);
has f3 => (
    is => 'ro', isa => 'Str',
    cmd_aliases => 'c',
    default => 'f3.log',
    predicate => 'has_c',
);

# this is run immediately after construction
sub BUILD
{
    my $this = shift;

    print "a was provided\n" if $this->has_a;
    print "b was provided\n" if $this->has_b;
    print "c was provided\n" if $this->has_c;
}

1;