4

与有何warn 4不同?print STDERR 4

perl -e 'local *STDERR; warn 4'

(输出仍然去STDERR

perl -e 'local *STDERR; print STDERR 4'

(这里没有输出)

4

3 回答 3

6
  • warn触发器$SIG{__WARN__}
  • warn不使用$\or $,
  • 正如您所展示的[1]warn显然使用了原始文件中的文件句柄。STDERR

  1. 不完全的。您的代码也可以证明warn直接使用 fd 2 ,但这被

    close(STDOUT);
    close(STDERR);
    open(STDERR, '>file');
    warn(fileno(STDERR)."abc");  # 1abc
    
于 2013-10-21T11:26:10.130 回答
4

尚未 使手柄静音。STDERR为了真正让它沉默,你需要说:

perl -e 'local *STDERR; open(STDERR, ">/dev/null") or die $!; warn 4'

perldoc perlvar告诉:

由于'IGNORE'不支持该钩子__WARN__,您可以使用空子例程禁用警告:

 local $SIG{__WARN__} = sub {};
于 2013-10-21T10:42:09.513 回答
2

local这里只说STDERR从此时开始 typeglob 是本地的,它不会改变任何与 STDERR 句柄已经被 sig warn 默认处理程序在你进入这个块时看到的东西。如果您想真正使 STDERR 静音,则需要重新打开其他句柄。

如果您想在本地使其静音然后恢复,如果您真的必须坚持使用低级 glob 和句柄,请按照以下步骤操作:

#!/usr/bin/perl -w
sub f() {
    local *STDERR;
    open STDERR, '>/dev/null';
    warn 4;
}
warn 3;
f();
warn 5;
于 2013-10-21T10:52:15.393 回答