sid*_*com 10 perl stdin stdout stderr
有时我必须使用裸字"STDOUT",有时裸字不起作用,有时我可以使用裸字或其他形式.是否有规则,告诉我什么时候我必须选择表格和另一个表格以及何时可以选择表格?
#!/usr/bin/env perl
use warnings;
use 5.12.0;
use utf8;
print STDOUT "Something\n"; # works
print \*STDOUT "Something\n"; # String found where operator expected
print { STDOUT } "Something\n"; # Bareword "STDOUT" not allowed while "strict subs" in use
print { \*STDOUT } "Something\n" # works
my $fh;
$fh = -t STDOUT ? STDOUT : STDERR; # Bareword "STDOUT"/"STDERR" not allowed while "strict subs" in use
$fh = -t STDOUT ? \*STDOUT : \*STDERR; # works
$fh = -t \*STDOUT ? \*STDOUT : \*STDERR; # works
Run Code Online (Sandbox Code Playgroud)
Mic*_*ade 12
根据我的测试,这些是规则:
当use strict subs有效时,裸字版本不能作为文件句柄传递,大概是因为它们可能是子程序调用.
该*STDOUT和\*STDOUT版本可用于传递给函数的所有时间.
将其中一个传递给带有foo STDOUT(没有括号)的子断点,因为perl假设是STDOUT->foo.
除了案例1和案例3之外,您还可以将它们传递给具有匿名词语的潜艇.
打往print,printf等等,您必须使用裸字版本,或使用{}.将文件句柄括起来{}告诉perl是的,第一个参数是文件句柄,所以你可以使用任何形式.
为了这些目的,-t计数为sub,其他-X测试接受文件句柄.
当使用{}与print或printf,里面的部分{}是一个代码块; 它被评估,结果用作文件句柄.它适用于这些函数,因为它们由perl特殊处理,与mapand一样grep.
所以遵循这些规则,你会没事的:
当explcitly打印到STDERR或STDOUT时,请使用裸字版本:
print STDERR "ERRORRRRR\n";
Run Code Online (Sandbox Code Playgroud)当以任何其他方式使用文件句柄时,请使用以下*版本:
my $isterm = -t *STDOUT;
close(*STDERR);
Run Code Online (Sandbox Code Playgroud)我测试的远远超过了perl 5.8.7.这是我现在可以追溯到目前为止.以上也适用于5.6.