将输出发送到logfile或STDOUT

时间:2011-05-22 23:08:23

标签: perl stdout logfile

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

这是我开始写的一个测试脚本,我开始试图想到这两个选项的组合。我知道我过分夸大了这一点。

#!/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选项并指定了01。如果它是1则写入该行,如果为0则不写。

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

提前致谢。

3 个答案:

答案 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为您提供了很长的选项,我已将选项名称更改为人类可读的verboselogfile,但您可以使用短-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的位置