my - レキシカル変数の宣言
myを使えばレキシカル変数を宣言することができます。
# レキシカル変数の宣言 my $num; my @nums; my %scores;
レキシカル変数というのは、C言語でいうところの、ローカル変数のことです。
Perlにはlocalというキーワードがあるのですが、こちらは実際には、ローカル変数を作成しません。localキーワードは、パッケージ変数を一時的に保存して復元するという機能を持っています。
myによる変数宣言は、Perl 5で追加された機能です。これは他の言語におけるローカル変数そのものなのですが、localというキーワードがすでにあるので、紛らわしくならないようにレキシカル変数という名前になったのかもしれません。
Perlでレキシカル変数といえば、他の言語におけるローカル変数のことだと考えてください。
変数宣言とは
変数宣言というのはこれから変数を使うよということを宣言するものです。新しく使う変数は「my」を使って変数宣言しましょう。
# スカラ変数の宣言 my $num;
スカラ変数のほかに、配列変数、ハッシュ変数を宣言することもできます。
# 配列変数の宣言 my @nums; # ハッシュ変数の宣言 my %score;
変数の初期化
変数宣言と同時に「変数の初期化」を行うことができます。
# スカラ変数の初期化 my $num = 3; # 配列変数の初期化 my @nums = (1, 2, 3); # ハッシュ変数の初期化 my %score = (math => 80, english => 70);
初期化を行わなかった場合はスカラ変数の場合は未定義値が代入されます。配列変数とハッシュ変数の場合は空リストが代入されます。
レキシカル変数とは
myを使うと「レキシカル変数」を宣言できると書きましたが、レキシカル変数とは、いったいなんでしょうか。レキシカル変数とは、レキシカルなスコープを持つ変数のことです。
レキシカル変数は、スコープの終わりになると、寿命がつきて、メモリから解放されます。
# スコープの開始 { my $num = 2; } # ここでは「$num」を利用できない。
レキシカルなスコープについての詳しい解説は以下をご覧ください。
strictモジュールとの連携
strictモジュールとmyによる変数宣言を一緒に使うと、変数宣言がない場合に、変数を使おうとした場合に、コンパイルエラーになります。
use strict; my $num = 1; # 変数名が間違っているのでコンパイルエラーになる print $nam;
意図しない変数の利用をすぐに発見できるので、Perlのプログラムでは、必ずstrictモジュールを使うようにしましょう。
strictモジュールについての詳しい解説は以下をご覧ください。
「my」と「our」と「local」による変数宣言の違い
Perlの変数宣言には「my」と「our」と「local」の三つがあります。
簡単に違いをいうと「my」は「レキシカル変数」の宣言、「our」は「パッケージ変数」の宣言、「local」は「パッケージ変数を宣言してスコープが終わるまで値を保存」という効果があります。
Perlで変数を宣言するときは「our」や「local」の使用はできる限り避けてください。現代のPerlでは「my」による変数宣言だけで、完全なプログラミングを行うことができます。
our、localに追加の解説は以下をご覧ください。