替代打印STDERR

时间:2013-03-02 06:08:27

标签: perl

我想替换代码库中现有的print STDERR语句。

显然,我发现它们不适合眼睛,或者只是我。我是否应该使用warn知道它将由$SIG{_WARN_}处理程序捕获。或者有更好的选择。如果是,为什么要使用这些选项而不是print STDERR

2 个答案:

答案 0 :(得分:2)

print STDERR的好处是,您可以立即看到将要发生的事情 - 您将某些内容打印到STDERR。这可能是调试消息,或其他什么。

warn功能略有不同:

  1. 它将触发警告处理程序,
  2. 如果您不以换行符结尾,它会附加行号。
  3. 您应该将此用于警告,而不是用于记录数据

    您可能也对Carp系列函数感兴趣。 carp的工作方式与warn类似,但会从通话点报告行号/文件。 cluckwarn带有堆栈跟踪。

    但没有什么可以阻止你自己滚动。函数等效的print STDERR子将是:

    sub debug { print STDERR @_ }
    

    你现在可以从字面上s/print STDERR/debug/g获得你的来源,除了那一次出现。此外,如果您希望能够省略参数周围的问题,则必须在使用之前声明或导入debug函数。

    debug "this ", "is ", "DATA";
    

    要考虑:调用sub是slooow,而print是内置操作码。你可以用美容来换取表现,反之亦然。

答案 1 :(得分:1)

创建一个debug子程序来包装print STDERR将为您提供超出简单printwarn语句提供的灵活性,例如转向的能力调试消息或将它们重定向到不同的目的地。例如,就在我的头顶:

sub debug {
  my ($msg, %param) = @_;

  $param{level} //= 1; # default if no level specified
  return if $param{level} < $config{log_level};

  given ($param{dest}) {
    when ('mail') { send_email_to_admin(subject => "Application Error!", body => $msg) }
    when ('log') { write_to_logfile($msg) }
    default { print STDERR $msg }
  }
}

debug('foo');   # goes to STDERR by default
$config{log_level} = 2;
debug('bar');  # message is ignored as unimportant at current logging level
debug('bar', level => 3, dest => mail); # still important; gets emailed to admin