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
。
如何做到这一点?
答案 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)
实现此目的的一种方法是使用Moose和MooseX::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;