2013-01-22 31 views
8

動的スコープを実装するには、localを使用していました。常にmy;を使用してください。ローカルを使用しないでください?

なぜローカル全く持っている:そして、私は、次の言うthisポスト、出くわしましたか?答えは90%の歴史です。 の初期バージョンPerlはグローバル変数しか持っていませんでした。 localは実装が非常に簡単で、ローカル変数 の問題の部分解としてPerl 4に が追加されました。

...決してローカルを使用しないでください。

使用は推奨されていませんか?はいの場合、代替手段は何ですか?

+0

あなたがリンクしている投稿は間違っていません。しかし**のステートメント**は決してローカル**を使用していません。関数呼び出し間の値を保持することは、 'local'の利点の1つです。 'my'を使うと、字句スコープができます。つまり、ブロックの中括弧と関数呼び出しの間でのみ有効です。すべての呼び出しで別々の値が必要な場合は、myを使用します。 'local'はグローバル変数をそのブロックのまったく新しい変数として再利用するためのものです。 –

+0

@Drt: 'local'変数は、関数呼び出しで値を保持しません。 – Borodin

+0

@borodin:from [perldoc](http://perldoc.perl.org/perlsub.html#Temporary-Values-via-local%28%29):ローカルの変数は、現在の変数の値が –

答えて

26

リンク先の投稿は誤解を招くか、少なくとも不完全です。レキシカル変数を作成するのに、localを決して使用しないでください。それはそうではありません、それはmyのためです。

localは、実際の機能が必要なときに使用します。グローバル変数に一時的な値を指定する。これは、Perlの特殊変数を一時的に設定するためによく使われます。古典的なケースは、このようなものです:一度にファイル全体を読み込むためには

{ 
    local $/; 
    $entire_file = <$filehandle>; 
} 

、あなたはundefinedにレコードセパレータを設定する必要があります。しかし、あなたは一時的にそれをしたいだけです。したがってlocalを使用する必要があります。

これは絶対にお勧めしません。良いPerlコードとみなされます。

更新:この記事には、実際には「決してローカルを使用しない」という文章が含まれています。それでも、私はそのような包括的な宣言をするのは間違いだと思う。私はノートが応答している批評家に同意する。上記の例は非常に一般的な、基本的なケースであり、その静脈にはlocalのいくつかの他の一般的な用途もあります。

私は、初心者のチュートリアルでは物事を単純なものにする必要があることを理解していますが、単純では不正確であるとは限りません。 "今のところ、localについて心配しないでください。myを"と同じように使ってみましょう。でも、は絶対にでなければなりません。

+2

+1私は同意します。ローカライズの仕組み*スコープ、プッシュダウン値*。 Perl Perl(表現力豊かなもの)の重要な部分です。下位互換性がない場合は、このような変数をもっと少なくして、希少性をさらに高めることができます。私は、この地方でできるのが最善のポイントだと思うのは、あなたが 'local'か' my'のどちらを使うのか混乱するなら、あなたはおそらく - または* lexical * 「マイ」。ケースの1%だけが別のアプローチを保証しても、それは「決して」より1%多い。 – Axeman

5

myを使用して、ローカル変数を作成します。これはほとんどの場合、人々が望むものです。

localの場合はlocalしか使用できません。グローバル変数に異なる値を設定すると、現在のブロックの後ろに復元されます。それは決して廃止されていません。これは安定しており、よくサポートされており、Perlの重要な機能です。しかし、多くの初心者はこれを行う必要はありません。

localを使用して、ローカル変数を作成しようとするのはお勧めしません。ローカル変数は、myを使用する必要があるためです。このためにlocalを使用する理由は決してありません。

1

実際に悪いアドバイスではありません。すべてのプログラミングディクタと同様に、暗黙の補遺は"unless you really know what you're doing"です。 localの正当な使用例があります。しかし、一般的に、localが正しいツールだと思うなら、続行する前に再考するべきです。

関連する問題