沉默STDERR和警告

Сух*_*й27 4 perl

warn 4什么不同print STDERR 4

perl -e 'local *STDERR; warn 4'
Run Code Online (Sandbox Code Playgroud)

(输出仍然是STDERR)

perl -e 'local *STDERR; print STDERR 4'
Run Code Online (Sandbox Code Playgroud)

(这里没有输出)

ike*_*ami 6

  • warn触发器$SIG{__WARN__}.
  • warn不使用$\$,.
  • 并且warn显然使用了原文中的文件句柄STDERR,正如您所演示的那样[1].

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

    close(STDOUT);
    close(STDERR);
    open(STDERR, '>file');
    warn(fileno(STDERR)."abc");  # 1abc
    
    Run Code Online (Sandbox Code Playgroud)

  • 我的解释有些不对(不完整?),因为它没有解释Vassilii Khachaturov代码的行为.我今天将进一步研究这个问题. (2认同)