我正在尝试提出一些逻辑,让我的脚本可以选择发送输出的位置。
这是我开始写的一个测试脚本,我开始试图想到这两个选项的组合。我知道我过分夸大了这一点。
#!/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
个参数,在我的第一次交互中只允许输出到stdout。我刚刚使用-o
选项并指定了0
或1
。如果它是1则写入该行,如果为0则不写。
如果有任何比上面更简单的解决方案,我会对任何事情持开放态度。
提前致谢。
答案 0 :(得分: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");
答案 1 :(得分:3)
在TLP的情况下,我建议使用$verbose
和$logfile
选项,如果使用$verbose
,我还建议将$logfile
隐式设置为true。像往常一样使用$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
或长{{ {1}}符合您的口味。
答案 2 :(得分: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
来改变STDOUT的位置