perl - 将输出发送到日志文件或 STDOUT

标签 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 个参数合并到同一个参数中,可以吗?

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

如果有比上面的解决方案更简单的解决方案,我愿意接受任何事情。

提前致谢。

最佳答案

按照 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或长--verbose

关于perl - 将输出发送到日志文件或 STDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6091430/

相关文章:

linux - 在 Oracle Enterprise Linux 上安装 Net::LDAP 时出错

perl - 是否允许将管道传递给构造函数?

c - 查看后台进程的输出

glassfish - OtrosLogViewer 中的错误

linux - Python - 从经常更新的远程日志文件中读取

regex - 在不同的行中查找一个匹配项,后跟另一个匹配项并对输出进行排序

perl - 测试 Catalyst URI

visual-c++ - Windows 上的 SDL2 窃取了我的 stdout 和 stderr

perl - 如何检测标准输出是否连接到 Perl 中的 tty?

Python Authlog 日志文件分析