warn 4
与print STDERR 4
的区别如何?
perl -e 'local *STDERR; warn 4'
(输出仍然转到STDERR
)
perl -e 'local *STDERR; print STDERR 4'
(此处无输出)
答案 0 :(得分:6)
warn
触发$SIG{__WARN__}
。warn
不使用$\
或$,
。warn
显然使用原始STDERR
中的文件句柄,因为您已经演示了 [1] 。不完全。您的代码也可以证明warn
直接使用fd 2,但
close(STDOUT);
close(STDERR);
open(STDERR, '>file');
warn(fileno(STDERR)."abc"); # 1abc
答案 1 :(得分:4)
您还没有 沉默 STDERR
句柄。为了真正沉默,你需要说:
perl -e 'local *STDERR; open(STDERR, ">/dev/null") or die $!; warn 4'
由于
'IGNORE'
不支持__WARN__
挂钩,您可以停用 使用空子程序的警告:local $SIG{__WARN__} = sub {};
答案 2 :(得分:2)
local
这里只表示typeglob STDERR
从这一点开始是本地的,它不会改变sig warn默认处理程序在进入此块时已经看到的STDERR句柄。如果你想让STDERR真正沉默,你需要重新打开其他句柄。
如果你想让它在本地沉默然后恢复,这里是如何做到的,如果你真的必须坚持使用低级别的手柄和手柄:
#!/usr/bin/perl -w
sub f() {
local *STDERR;
open STDERR, '>/dev/null';
warn 4;
}
warn 3;
f();
warn 5;