変数とは
数値 文字、文字列 リスト 配列 式 式の結果 |
等を一時的に格納しておく事ができる箱(メモリ領域)の事で、自由に名前を付けて作成できるものと「予約変数」と呼ばれる言語で予め使用する為のものがあります。
Perlの変数には、大きく分けると予約変数(特殊変数・自動変数等)と比較的自由に使うことができる一般的な変数、更に(値が格納された)変数のアドレスを格納するリファレンス変数の3種類あり、この他、Perlに備わる特殊な変数があります。
Perlにも予約変数があり、また特殊な変数があります。
Perlの特殊変数には、ループ処理で自動的にその時点の要素の値を1つだけ格納する
$_ |
主にサブルーチンで引数を受け取る際などに自動的に全ての引数が格納される
@_ |
などがあります。
また、パターンマッチ等で直前に丸かっこ( )でグループ化されたパターンが複数存在する式において自動的に左からパターンが1から順次格納される
$1,$2,$3... |
その際、実行したスクリプトファイル名やコマンド名が格納される
$0 |
という特殊変数もあり、これらはとても便利でPerlが自動的に格納してくれます。
更にその直前で検索、置換された対象部分より前の情報、対象文字列、対象文字列より後ろの情報を自動的に保持する下記のような変数もあります。
$` # 対象文字列より前 ($+バッククォート) $& # 対象文字列 ($+アンパサンド) $' # 対象文字列より後 ($+シングルクォート) |
それまでの動作におけるエラー情報を自動的に保持する下記のような変数もあります。
$! エラー情報 ($+エクスクラメーションマーク) |
また、特殊変数ではない、Perlの一般的な変数(変数名は任意)は
スカラー変数 『$』ではじまる変数 例) $abc 文字列キー配列変数 『%』ではじまる変数 例) %abc 数値キー配列変数(配列の操作方法) 『@』ではじまる変数 例) @abc |
等があり、各々の例では記号以降が同じ「abc」になっていますが、これを同じ領域内に設定した場合でもPerlは全く無関係の変数として扱います。
因みに大文字・小文字も区別します。($abcと$Abcは違うもの)
これらはそれぞれ
『スカラー変数 $』 :一般的な変数 『文字列キー配列変数 %』 :キーと値をセットで持てるが要素の順番が不定の配列 『数値キー配列変数 @』 :要素の順番が特定の一般的な配列 |
という意味を持っており、文字列キー配列変数は、ハッシュ(hash)または連想配列とも呼ばれます。
但し、ハッシュという呼び方には賛否両論あるようですが、通称としてハッシュという言葉も広まっています。
これは、数値キー配列変数[@abc]の要素参照が、
実体要素の参照
$abc[0],$abc[1],$abc[2],$abc[3]...
といった数値をキーとする添え字を利用するのに比し、[%abc]の要素参照は、
実体要素の参照
$abc{'名前'},$abc{'カナ'},$abc{'かな'},$abc{'趣味'}...
といった具合に文字列をキーとして参照する事ができ、格納された値が連想できるリストだからです。
ちなみに日本語文字なのでシングルクォーテーションで括っていますがキー値が半角アルファベットであれば括る必要はありません。
これらは、変数に格納されている値そのままを参照するいわゆる実体参照ですが、Perlは基本的にその内容のコピーを取って処理するので関数の引数としてやりとりする場合など、大きなデータである場合には特に実行時のオーバーヘッドが大きくなります。
そこで他のプログラミング言語などと同様にPerlでも変数に格納されたデータの領域を参照することができます。
Perlで変数の領域参照をするには、変数の前に[ \ ](バックスラッシュ)を入れますが、これをリファレンスと呼びます。
\$abc スカラー変数$abcへのリファレンス
\@abc 数値キー配列変数@abcへのリファレンス
\%abc 文字列キー配列変数%abcへのリファレンス
また、サブルーチン(関数)もリファレンスが可能です。
\&abc サブルーチン&abcへのリファレンス
[ \$abc ][ \@abc ][ \%abc ]、[ \&abc ]いずれのリファレンスもデータが格納された領域の位置情報1つなのでリファレンス変数を関数の返り値として受け取るといった場合には、スカラー変数[ $ ]に代入することができます。
$ref_scalar = \$abc ;
$ref_num_type_array = \@abc ;
$ref_str_type_array = \%abc ;
$ref_subroutine = \%abc ;
実体を参照するには、バックスラッシュ\(日本語環境では円マーク)を付けたリファレンスから見ると[ $ ]を各変数のprefix/前置詞$,@,%の後ろに付加、他方、この領域参照を持つリファレンス変数から見るとリファレンス変数の接頭辞[ $ ]の前に各変数の前置詞$,@,%を付加することになります(何れも結果としては同じ)。
$$abc スカラー変数$abcへのリファレンス(\$abc)の実体参照
@$abc 数値キー配列変数@abcへのリファレンス(\@abc)の実体参照
%$abc 文字列キー配列変数%abcへのリファレンス(\%abc)の実体参照
&$abc サブルーチン&abcへのリファレンス(\&abc)の実体参照
スカラー変数$abcに格納した数値キー型配列リファレンスの要素の実体を参照する場合には、実体参照@$abcに添え字を付けて @$abc[0] とするか、または、リファレンス$abcにArrow Operator/アロー演算子/矢印演算子 -> を使って $abc->[0] とします。
@$abc[0],@$abc[1],@$abc[2],@$abc[3]...
$abc->[0],$abc->[1],$abc->[2],$abc->[3]...
スカラー変数$abcに格納した文字列キー型配列リファレンスの要素を参照するには矢印演算子 -> を使います。
$abc->{'名前'},$abc->{'カナ'},$abc->{'かな'},$abc->{'趣味'}...