Perl 消声标准和警告
Perl 消声标准和警告,perl,Perl,warn 4与print STDERR 4有何不同 perl -e 'local *STDERR; warn 4' (输出仍然转到STDERR) (此处无输出)您还未使STDERR句柄静音。为了让它安静下来,你需要说: perl -e 'local *STDERR; open(STDERR, ">/dev/null") or die $!; warn 4' 说明: 由于\uuuu WARN\uuuu不支持'IGNORE'钩子,因此可以禁用 使用空子例程的警告: local $SIG
warn 4
与print STDERR 4
有何不同
perl -e 'local *STDERR; warn 4'
(输出仍然转到STDERR
)
(此处无输出)您还未使
STDERR
句柄静音。为了让它安静下来,你需要说:
perl -e 'local *STDERR; open(STDERR, ">/dev/null") or die $!; warn 4'
说明: 由于
\uuuu WARN\uuuu
不支持'IGNORE'
钩子,因此可以禁用
使用空子例程的警告:
local $SIG{__WARN__} = sub {};
local
这里只说明typeglobSTDERR
从此点开始是本地的,它不会改变任何在您进入此块时sig warn default handler已经看到的STDERR句柄。如果你真的想让STDERR安静下来,你需要重新打开其他东西的句柄
如果您想在本地使其静音,然后进行恢复,如果您确实必须坚持使用低级别的glob和handles,那么下面是如何做到的:
#!/usr/bin/perl -w
sub f() {
local *STDERR;
open STDERR, '>/dev/null';
warn 4;
}
warn 3;
f();
warn 5;
触发warn
$SIG{{uuuuu warn}
不使用warn
或$\
$,
- 而
显然使用了原始warn
中的文件句柄,如您所演示的[1]STDERR
warn
直接使用FD2,但这一点被
close(STDOUT);
close(STDERR);
open(STDERR, '>file');
warn(fileno(STDERR)."abc"); # 1abc
那么为什么
perl-e'local*STDERR;打印标准4'
是否按预期工作?否open()
此处?由于问题发生了变化,我也对答案进行了一些编辑:-)打印内容在词汇上绑定到本地声明的STDERR,但尚未打开…Re:“它还没有用STDERR更改任何内容。”是的perl-E“say*STDERR{IO}| |-”;local*STDERR;say*STDERR{IO}|-”
tnx,但我熟悉%SIG
,不知道为什么本地*STDERR;print STDERR 4
按预期工作,而warn
不起作用t@mpapec因为warn 4
和print STDERR 4
不等效。说warn
会导致perl发送一个信号,在另一个例子中,您正在向FD.btw写入,我修改了您的一行代码,临时禁用所有STDERR输出perl-e'{local*STDERR;open STDERR,“>”,\my$o或die$!;warn 4;}warn 6'
也应该在草莓下工作。@mpapec-Yup,你也可以说open STDERR,“>NULL”
(我知道还有整整4个字符)。对不起,我不明白你所说的fd2
和STDERR
是什么意思。所以STDERR
是原创的,而fd2
是perl STDERR吗?关于fd2
我所说的就是它在这里不相关。所以忽略这一点local*STDERR
创建一个新的STDERR
warn
使用原始的STDERR
.tnx,正如我现在理解的,有三件事:fd2
、原始的STDERR(从perl开始)和当前的stdersomething与我的解释不符(不完整?),因为它不能解释Vassilii Khachaturov代码的行为。今天我将进一步研究这个问题。内置警告处理程序与标准错误的关系是特殊的。请参阅Perl_write_to_stderr(),它是Perl_warn()链的核心
close(STDOUT);
close(STDERR);
open(STDERR, '>file');
warn(fileno(STDERR)."abc"); # 1abc