交替打印STDERR

  • 本文关键字:STDERR 打印 perl
  • 更新时间 :
  • 英文 :


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

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

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

warn的功能略有不同:

  1. 它将触发警告处理程序,并且
  2. 如果您不以换行符结尾,它将附加行号

您可能应该将其用于警告,而不是用于记录数据

您可能还对Carp函数族感兴趣。carp的工作原理与warn类似,但从调用点报告线路号/文件。cluck将使用堆栈跟踪warn

但没有什么能阻止你自己滚动。与print STDERR功能等效的子系统是:

sub debug { print STDERR @_ }

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

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

需要考虑的一点是:调用一个sub是slooow,而print是一个内置的操作码。你可以用美丽换取性能,反之亦然。

创建一个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

最新更新