2013-06-29 10 views
8

documentation for the open functionとしてopen()の構文を示します。なぜPerlのopen()ドキュメントは2つの異なるFILEHANDLEスタイルを使用していますか?

  • オープンFILEHANDLE、EXPR
  • オープンFILEHANDLE、MODE、EXPR
  • オープンFILEHANDLE、MODE、EXPR、LIST
  • オープンFILEHANDLE、MODE、REFERENCE彼らは場所を持っている例で
  • オープンFILEHANDLE

ダウン

open(my $fh, "<", "input.txt") 

とも例裸の単語が使用されます:通常$ -prefixed変数はファイルハンドルのために使用される

open(FOO, "|tr '[a-z]' '[A-Z]'"); 

一つの質問は、「それぞれのスタイルの名前がでているものですいずれの場合も、ファイルハンドルには_ _を使用していますか?もう1つは、なぜopen()の裸の単語をドキュメントで使用し始めましたか?それ以降の使用はすべて通常のファイル名open()を含まないように見えます。これらのインスタンスでは、$ -prefixedフォームは受け入れられませんか?

+1

私はいつもその構文で悩まされてきました。 – qwwqwwq

+0

これ以外の方法で 'open(STDOUT、" less ")をするのは面倒です。 – tchrist

答えて

20

ベアワードフォームは、本質的に、下位互換性のための歴史上の遺産です。字句変数を使用することは、新しいコードではほとんど常に正しいことです。

ちなみに、$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 $foomy @fooは2つの異なるスクラッチパッド(スコープ)に存在することができます。 my *fooには、これらの両方とファイルハンドルfoo(と私はそれを誓うことはありませんが、format指定子のような他のあいまいなコーナーケースが潜在的に含まれます)。

bareword形式のファイルハンドルを関数などに渡すことも非常に困難です。

基本的に、ベアワードはグローバルスコープのすべての欠点を継承し、レキシカル変数の利点はありません。

perldoc perldataには、TypeglobsとFilehandlesという素晴らしいセクションがあり、おそらくこれらのことをもう少し明確に説明しています。私は便利なコピーを持っていませんが、私はCamelがこの件についてもっと詳しく説明してくれると信じています。それは別の場所で使用される名前と競合する可能性がありますのでFOOは、グローバル変数のようなものであるため、FOOが廃止されたと考えられているのに対し、

+5

+1:字句ファイルハンドルを使用するのは、PerlのようにTMTOWTDI(複数の方法があります)でも、「行う方法」です。 –

+1

@JonathanLefflerは強い点と瑕疵の両方を持っています。 – jordanm

+0

私はちょっと古いスキルです。私はときどきglobスタイルのファイルハンドルを答えに使用し、これについては常に否定的なコメントを得ています:)字句ファイルハンドルが良いと同意しますが、中断するのは難しい習慣です! – Vorsprung

2

BPRocockが言ったように、my $xは、これらの日好ましいです。別の理由がある$xが奨励されています:$xは、範囲の最後に自動的にclose edされます。

関連する問題