2016-11-27 5 views
4

Perlでは、filehandleはデータ型であり、このような型の変数には何らかのsigil接頭辞があると思います。ただし、次のコード(第二オープン)は、それは私が第二のフォーム混乱/矛盾を発見したなぜファイルハンドルがPerlでsigilを必要としないのですか?

open my $fileHandle, '>', "out.txt"; 
open FH, '>', "out2.txt"; 

場合ではないということを示しています。 2番目のフォームを許可する理由は何ですか?

答えて

6

2番目の形式は元の形式であるため許可されています。あなたは、ファイルハンドルを含むglobの名前だけでファイルハンドルを参照できるようにしていました。現在、ファイルハンドルには、グロブ名やファイルハンドルオブジェクトを囲むグロブへの参照、ファイルハンドルオブジェクトへの参照を指定できます。後者の2つはスカラに格納することができます(したがって、語彙的スコープにすることもできます)。

新しいコードでは、ファイルハンドルとしてグロブを使用しないでください。

+0

ysth: "ファイルハンドルオブジェクトを包んでいるglobへの参照"と "ファイルハンドルオブジェクトへの参照"とはどのように違うのですか? 2件の事例を挙げてください。 – Ltf4an

+0

@ Ltf4anあなたは後者を得るために道を離れる必要があります(例えば '* SOMEGLOB {IO}'や 'Symbol :: geniosym()')。私は完全性のためだけにそれを言いました。あなたがシンボルテーブルで遊んでいない限り、通常は何の理由もありません。 – ysth

4

一般的に言えば、グロブを参照するときはsigilが必要です。

my $fh = STDOUT; # XXX Short for: my $fh = "STDOUT"; 
my $fh = *STDOUT; # ok 

しかし、グロブ(例えばopenprintreadline別名<>、など)を期待する機能は、それが任意します。

print STDOUT "foo\n"; # Short for: print *STDOUT "foo\n"; 

あなたは*プロトタイプでこれを近似することができます。

sub foo { } 
sub bar(*) { } 

foo(STDOUT); # XXX Fails when using "use strict;" 
bar(STDOUT); # ok 

第二のフォームを許可する理由は何ですか?

(グローバル・シンボルを使用して)第2の形式は5.6で導入open(my $fh, ...)のサポートに先行します。実際、それは字句(my)変数の存在に先立っています。可能な限りグローバル変数を避けるべきであるので、open(FH, ...)はお勧めできません。

関連する問題