1

脚本文件

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

4 回答 4

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";
于 2010-09-07T11:54:08.947 回答
1
if (defined $f1) {
  # You got a -a option
}

但就我个人而言,我更喜欢将选项读入哈希,然后使用exists()。

于 2010-09-07T11:52:20.857 回答
1
$f1 = "$f1.log" unless $f1 =~ m/\.log$/i;

如果文件名还没有,则附加日志扩展名。由于默认值以log结尾,因此没有任何反应。如果用户在命令行上键入日志,它就会起作用。

于 2010-09-07T11:55:55.913 回答
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;
于 2010-09-07T16:26:58.793 回答