是否有规则告诉我什么形式的STDOUT/STDERR/SDTIN我必须选择?

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

根据我的测试,这些是规则:

  1. use strict subs有效时,裸字版本不能作为文件句柄传递,大概是因为它们可能是子程序调用.

  2. *STDOUT\*STDOUT版本可用于传递给函数的所有时间.

  3. 将其中一个传递给带有foo STDOUT(没有括号)的子断点,因为perl假设是STDOUT->foo.

  4. 除了案例1和案例3之外,您还可以将它们传递给具有匿名词语的潜艇.

  5. 打往print,printf等等,您必须使用裸字版本,或使用{}.将文件句柄括起来{}告诉perl是的,第一个参数是文件句柄,所以你可以使用任何形式.

为了这些目的,-t计数为sub,其他-X测试接受文件句柄.

当使用{}printprintf,里面的部分{}是一个代码块; 它被评估,结果用作文件句柄.它适用于这些函数,因为它们由perl特殊处理,与mapand一样grep.

所以遵循这些规则,你会没事的:

我测试的远远超过了perl 5.8.7.这是我现在可以追溯到目前为止.以上适用于5.6.