Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 消声标准和警告_Perl - Fatal编程技术网

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
这里只说明typeglob
STDERR
从此点开始是本地的,它不会改变任何在您进入此块时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
    显然使用了原始
    STDERR
    中的文件句柄,如您所演示的[1]

  • 不完全是。您的代码还可以证明
    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