10

有时我必须使用裸词“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 
4

1 回答 1

12

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

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

  2. 和版本可以一直用来传递给函数*STDOUT\*STDOUT

  3. 将其中一个传递给带有foo STDOUT(不带括号)的 sub 会中断,因为 perl 假定它是STDOUT->foo.

  4. 除了案例 1 和 3,您还可以将它们传递给带有裸字版本的 subs。

  5. 对于对 等的调用printprintf您必须使用裸字版本,或使用{}. 包含文件句柄{}告诉 perl 第一个参数是文件句柄,所以你可以使用任何形式。

出于这些目的,与其他接受文件句柄的测试-t一样,都算作一个子项。-X

当你使用{}withprintprintf时,里面的部分{}是一个代码块;它被评估并且结果被用作文件句柄。它适用于这些函数,因为 perl 对它们进行了特殊处理,其方式与map和相同grep

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

  • 显式打印到 STDERR 或 STDOUT 时,请使用裸字版本:

    print STDERR "ERRORRRRR\n";
    
  • 以任何其他方式使用文件句柄时,请使用以下*版本:

    my $isterm = -t *STDOUT;
    close(*STDERR);
    

我早在 perl 5.8.7 就进行了测试。这是我现在可以去的最远的地方。以上内容适用于 5.6。

于 2012-05-07T08:56:18.223 回答