与有何warn 4
不同?print STDERR 4
perl -e 'local *STDERR; warn 4'
(输出仍然去STDERR
)
perl -e 'local *STDERR; print STDERR 4'
(这里没有输出)
与有何warn 4
不同?print STDERR 4
perl -e 'local *STDERR; warn 4'
(输出仍然去STDERR
)
perl -e 'local *STDERR; print STDERR 4'
(这里没有输出)
warn
触发器$SIG{__WARN__}
。warn
不使用$\
or $,
。warn
显然使用了原始文件中的文件句柄。STDERR
不完全的。您的代码也可以证明warn
直接使用 fd 2 ,但这被
close(STDOUT);
close(STDERR);
open(STDERR, '>file');
warn(fileno(STDERR)."abc"); # 1abc
您尚未 使手柄静音。STDERR
为了真正让它沉默,你需要说:
perl -e 'local *STDERR; open(STDERR, ">/dev/null") or die $!; warn 4'
由于
'IGNORE'
不支持该钩子__WARN__
,您可以使用空子例程禁用警告:local $SIG{__WARN__} = sub {};
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;