2

我正在尝试提出一些逻辑,让我的脚本可以选择将输出发送到哪里。

这是我开始编写的一个测试脚本,我开始尝试思考这两个选项的组合。我知道我想太多了。

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $output = 0;

my $logfile = '';

GetOptions(

    'o' => \$output,
    'l' => \$logfile

);

if (($output == 1) && (! $logfile eq '')){



} elsif (($output == 0)($logfile eq '')){



}

如果这有任何用处,请成为我的客人。

几乎我想要3个选项

0 = 关闭 1 = 标准输出 2 = 日志文件

如果我想添加自定义日志文件参数时,我会向自己扔扳手。我的印象是我不能将 2 个 arg 组合成同一个 arg,可以吗?

我将要写入输出的地方,我将if根据条件使用简单的语句来控制,在我的第一次交互中,它只允许输出到标准输出。我只是使用了该-o选项并指定了0or 1。如果为 1,则写入该行,如果为 0,则不写入。

如果有比上述解决方案更简单的解决方案,我对任何事情都持开放态度。

提前致谢。

4

3 回答 3

3

我会$verbose用作一个选项和一个可选的$logfile. 因此,如果$verbose已设置,则打印,如果$logfile已设置,则打印到日志。

然后使用:

if ($logfile) {
    open STDOUT, '>', $logfile or die $!;
}
print "Yada\n" if $verbose;

或为简单起见:

sub myprint {
    return unless $verbose;
    print @_;
}
myprint("Yada\n");
于 2011-05-22T23:15:50.487 回答
3

在 TLP 的脉络中,我建议使用 a$verbose和 a$logfile选项,如果使用,我还建议将$verbose其隐式设置为 true $logfile。像往常一样用于$verbose控制print命令。如果没有给出文件句柄,最大的魔力是用来select控制发送输出的位置。print

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $verbose = 0;
my $logfile;

GetOptions(

    'verbose' => \$verbose,
    'logfile=s' => \$logfile,

);

if (defined $logfile) {
  $verbose = 1;
  open my $log_handle, '>', $logfile or die "Could not open $logfile";
  # select makes print point to LOGFILE 
  select($log_handle);
}

# do stuff

print "Stuff" if $verbose;

此外,由于Getopt::Long为您提供了长选项,我已将选项名称更改为人类可读的verbose和,但是您可以根据自己的喜好logfile使用短-v或长。--verbose

于 2011-05-22T23:28:16.293 回答
0

好的,首先,如果这种语法错误,请原谅我。自从我做任何 perl 以来已经很久了,所以把它更多地当作“做这种事情”而不是“复制并粘贴我的答案”。话虽如此,我可能会这样做:

#!/usr/bin/perl
use strict;
use warnings;

# Modules to load
use Getopt::Long;
use Term::ANSIColor qw(:constants);

my $output = 0;
my $logfile = '';

GetOptions(

    'o' => \$output,
    'l' => \$logfile

);

if (($output == 1) && (! $logfile eq '')){
    open STDOUT, $logfile
} elsif (($output == 0)($logfile eq '')){
    open STDOUT, "/dev/null"
}

... (do stuff normally here)

我所做的就是通过将 STDOUT 发送到日志文件或发送到/dev/null

于 2011-05-22T23:15:39.280 回答