web-dev-qa-db-ja.com

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

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

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

しかし、マニュアルには次のように書かれています:

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

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

86
FistOfFury

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

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


関連資料: なぜuse strict;およびuse warnings;?を使用するのか

131
ikegami

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

以下の例では、$ :: aは 'global'名前空間の$ 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)に感謝します。

26
Igor Chubin

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

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

4
cjm