Perlで「my」キーワードをどのように使用すればよいですか?


90

オンラインのPerlスクリプトの例では、変数名の前に「my」キーワードが表示され続けますが、それが何を意味するのかわかりません。マニュアルページや他のサイトをオンラインで読んでみましたが、使用方法の見方とマニュアルの違いを考えると、それが何であるかを理解するのに苦労しています。

たとえば、この投稿では配列の長さを取得するために使用されています: Perlで配列のサイズを見つける

しかし、マニュアルは言う:

リストされた変数は、囲んでいるブロック、ファイル、またはevalに対してローカル(字句的に)であると宣言します。複数の値がリストされている場合は、リストを括弧で囲む必要があります。

それは何をし、どのように使用されますか?


3
「この投稿で配列の長さを取得するために使用された」に関しては、まったく違います。my少なくともそれを考慮に入れませんでした。に=スカラーコンテキストを適用したのは、スカラー割り当て演算子()です@arr
池上2014年

それが本当に「自分のもの」でない場合は、使用しないでください。
icenac 2017年

回答:


139

my変数のスコープを制限します。変数のスコープは、それが見える場所です。変数のスコープを変数が必要な場所に限定することは、優れたプログラミングの基本的な側面です。これにより、コードが読みやすくなり、エラーが発生しにくくなり、多くの派生的な利点が得られます。

を使用して変数を宣言しない場合はmy、代わりにグローバル変数が作成されます。これは避けてください。を使用use strict;すると、暗黙的にグローバル変数を作成しないようにすることをPerlに指示します。これが、プログラムで常にuse strict;(およびuse warnings;)を使用する必要がある理由です。


関連する読み物:なぜ使用しuse strict;use warnings;


10
最後に理由を説明する答え。
ThisSuitIsBlackNot 14年

JSからここに来る人のために:それは本質的のようなものだvarletJavaScriptで。なけれ'use strict';JSあなたが実践の最高とみなされていないいずれかのキーワードを、することなく、新しいグローバル変数を宣言できるようになります。
エレクトリックコーヒー

@Electric Coffee、JS用語では、質問は「何をして何letvarし、どのように使用する必要があるか」です。そして、はい、答えはほぼ同じです。(JSのlet変数は、変数をmylet
取得

私が人々がJSからPerlに来たなら、それは同じ概念を説明する簡単な方法になるだろうことを意味しました
Electric Coffee

@ElectricCoffee 1)スコーピングを理解しているプログラマは、言語を切り替えた後、スコーピングについて再度説明する必要はありません。2)実際にスコーピングについて説明したかどうか、JSプログラマーが理解するかどうかでわかりません。たぶん、あなたは説明しようとしていましたuse strict;か?しかし、それは問題ではなく、use strict;それ以上のことを行います。それとも、それが通信するためのものmyちょっと似VARSの範囲を限定letしてvar行うが、それはかなりの答えの最初の文です。3)別の質問に答えたい場合は、それがAnswersの目的です。
池上

27

簡単な要約:my新しい変数を作成し、変数localの値を一時的に修正します

以下の例では、$ :: aは「グローバル」名前空間の$ aを参照しています。

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

つまり、local変数の値を一時的に変更しますが、変数が存在するスコープ内のみです。

出典:http : //www.perlmonks.org/?node_id=94007

更新

違いについてourmy参照してください。

ThisSuitIsBlackNotに感謝します)。


「彼ら」を説明する気?私はいつもそれらを混乱させてきました。
rdodev 2014年

@rdodev:どういう意味ですか?
イゴールチュビン2014年

私は「my」と「their」の両方でperlコードを確認し続けていますが、実際にはその違いをまったく理解していません。
rdodev 2014年

@rdodev:いくつかのコードへのリンクを送っていただけませんtheirか?
イゴールチュビン2014年

3
@rdodev私はあなたが意味を考えるourstackoverflow.com/questions/845060/...
ThisSuitIsBlackNot

4

my()によるプライベート変数は、の主要なドキュメントですmy

あなたが言及した配列サイズの例では、それは配列のサイズを見つけるために使用されていません。配列のサイズを保持する新しい変数を作成するために使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.