ベアワードフォームは、本質的に、下位互換性のための歴史上の遺産です。字句変数を使用することは、新しいコードではほとんど常に正しいことです。
ちなみに、$x
はあなたが言ったように@Joe_Zがで指摘したように、裸の単語
詳細/余談ただ、完全性について
と呼ばれ、FOO
がある字句スカラー変数、あります→コメント、レキシカルなファイルハンドルオブジェクトは、Perl 5.005と5.6の間のかなりの書き換えの一部として(比較的新しいものです)(バージョン番号ではさらに大きなオーダーを獲得しました...)。
しかし、技術的には、裸の単語FOO
(または、たとえばSTDIN
)は、ファイルハンドルのためだけに別の名前空間で解釈されます。
- あなたが特定の機能の間接オブジェクトスロットに参照することができ、:ファイルハンドルネームスペースの印章(等
$ @ % &
)が存在しないので、その名前空間内のファイルハンドルを参照する唯一の2つの方法がありますprint
のように(歴史的な理由から)、ベアワードはファイルハンドルを参照する必要があると推論するでしょう。
- 「
FOO
にバインドされている名前空間のすべて」を指す*FOO
のようなタイプグロブを使用できます。いくつかの言語で、Cまたはスキームのように、一つのシンボルは何型シギルを持っていない、ので、すべてのシンボルは、一方向にのみバインドすることができ
注意(例えば、1つはprintf
という名前の変数とprintf
という名前の関数を使用することはできませんCで...一般的に)、Perlや(例えば)Common Lisp、同じシンボルfoo
は、多くの異なるものにバインドすることができます。その違いは、Perlは実際にあなたがほとんどの文脈で "どれがfoo
を意味するのか"を明確にするためにsigilsを使う必要があるということです。 $foo
,@foo
= @foo[ $x .. $y]
,$foo[ $n ]
,%foo
= @foo{ $k1, $k2 }
= $foo{ $k }
,&foo
など。ファイルハンドルとして裸の単語を使用することにより
、しかし、あなたには、いくつかの能力を失う:
重要なのは、ローカルまたは字句それらをバインド(の代わりに、世界的に)するために、あなたはすべての名前空間にごとシンボルをバインドする必要がある、なぜなら利用可能なsigilはありません。したがって、my $foo
とmy @foo
は2つの異なるスクラッチパッド(スコープ)に存在することができます。 my *foo
には、これらの両方とファイルハンドルfoo
(と私はそれを誓うことはありませんが、format
指定子のような他のあいまいなコーナーケースが潜在的に含まれます)。
bareword形式のファイルハンドルを関数などに渡すことも非常に困難です。
基本的に、ベアワードはグローバルスコープのすべての欠点を継承し、レキシカル変数の利点はありません。
perldoc perldata
には、TypeglobsとFilehandlesという素晴らしいセクションがあり、おそらくこれらのことをもう少し明確に説明しています。私は便利なコピーを持っていませんが、私はCamelがこの件についてもっと詳しく説明してくれると信じています。それは別の場所で使用される名前と競合する可能性がありますのでFOO
は、グローバル変数のようなものであるため、FOO
が廃止されたと考えられているのに対し、
私はいつもその構文で悩まされてきました。 – qwwqwwq
これ以外の方法で 'open(STDOUT、" less ")をするのは面倒です。 – tchrist