Perlでは、filehandleはデータ型であり、このような型の変数には何らかのsigil接頭辞があると思います。ただし、次のコード(第二オープン)は、それは私が第二のフォーム混乱/矛盾を発見したなぜファイルハンドルがPerlでsigilを必要としないのですか?
open my $fileHandle, '>', "out.txt";
open FH, '>', "out2.txt";
場合ではないということを示しています。 2番目のフォームを許可する理由は何ですか?
Perlでは、filehandleはデータ型であり、このような型の変数には何らかのsigil接頭辞があると思います。ただし、次のコード(第二オープン)は、それは私が第二のフォーム混乱/矛盾を発見したなぜファイルハンドルがPerlでsigilを必要としないのですか?
open my $fileHandle, '>', "out.txt";
open FH, '>', "out2.txt";
場合ではないということを示しています。 2番目のフォームを許可する理由は何ですか?
2番目の形式は元の形式であるため許可されています。あなたは、ファイルハンドルを含むglobの名前だけでファイルハンドルを参照できるようにしていました。現在、ファイルハンドルには、グロブ名やファイルハンドルオブジェクトを囲むグロブへの参照、ファイルハンドルオブジェクトへの参照を指定できます。後者の2つはスカラに格納することができます(したがって、語彙的スコープにすることもできます)。
新しいコードでは、ファイルハンドルとしてグロブを使用しないでください。
一般的に言えば、グロブを参照するときはsigilが必要です。
my $fh = STDOUT; # XXX Short for: my $fh = "STDOUT";
my $fh = *STDOUT; # ok
しかし、グロブ(例えばopen
、print
、readline
別名<>
、など)を期待する機能は、それが任意します。
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, ...)
はお勧めできません。
ysth: "ファイルハンドルオブジェクトを包んでいるglobへの参照"と "ファイルハンドルオブジェクトへの参照"とはどのように違うのですか? 2件の事例を挙げてください。 – Ltf4an
@ Ltf4anあなたは後者を得るために道を離れる必要があります(例えば '* SOMEGLOB {IO}'や 'Symbol :: geniosym()')。私は完全性のためだけにそれを言いました。あなたがシンボルテーブルで遊んでいない限り、通常は何の理由もありません。 – ysth