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. それらの1つを(括弧なしで)サブに渡すとfoo STDOUT、perlはそれをと想定するために中断しますSTDOUT->foo

  4. ケース1と3を除いて、ベアワードバージョンを使用してサブに渡すこともできます。

  5. などの呼び出しにはprintprintfベアワードバージョンを使用するか、を使用する必要があります{}。ファイルハンドルをで囲むと{}、最初の引数がファイルハンドルであることがperlに通知されるため、任意の形式を使用できます。

これらの目的では、ファイルハンドルを受け入れる-t他のテストと同様に、サブとしてカウントされます。-X

またはで使用{}する場合、内部の部分はコードブロックです。評価され、結果がファイルハンドルとして使用されます。これらの関数は、およびと同じように、perlによって特別に処理されるため、これらの関数で機能します。printprintf{}mapgrep

したがって、これらのルールに従ってください。そうすれば大丈夫です。

  • STDERRまたはSTDOUTに明示的に印刷する場合は、ベアワードバージョンを使用してください。

    print STDERR "ERRORRRRR\n";
    
  • 他の方法でファイルハンドルを使用する場合は、次の*バージョンを使用してください。

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

私はperl5.8.7までさかのぼってテストしました。これは私が今行くことができる限り遡ります。上記は5.6でも機能するはずです。

于 2012-05-07T08:56:18.223 に答える