Location : Home > Languages > Perl > Instruction Title : Variables |
![]() |
Variables
Perl で扱うデータの定義・表現について。たいていプログラミング言語の説明ではまず変数の型宣言に関する記述があるのだろうが、Perl は若干趣きが異なるかも知れない。
変数の種類
多くの言語では、使用する変数の型を宣言し、処理系ではそれに対応したメモリ確保を行うことが多いのだが、Perl では根本的な型宣言の考え方は「単数」か「複数」かだと言われる。1つの値しかとらない変数はスカラ(scalar)と呼ばれ、複数の値をとる変数は配列(array)と呼ばれる。これらは変数の前に型を指示する記号(プレフィクス)をつけて識別する。
型 | 文字 | 例 | 意味 |
スカラ | $ | $Scalar | (代入された)値 |
配列 | @ | @Array | (代入された)値のリスト |
ハッシュ | % | %Hash | 文字列でキーを指定された値のグループ |
サブルーチン | & | &subroutine | サブルーチン |
型グロブ | * | *glob | globという名前をもつもの全て |
変数名で付けれれる名称は、英字( a〜z、A〜Z ) またはアンダースコア( _ )で始まり、英字・アンダースコア・数字( 0〜9 )が続く文字列でなければならない。文字数の制限はないが、大文字・小文字は区別される。したがって $123 などは変数名としては無効である。
スカラ変数は1個のスカラー値を格納する。
Perl では整数・小数点・文字列などの違いによる型宣言を行う必要がない。ただし10進数の数値を表したい場合、冒頭に 0 または 0x をつけてはならない。先頭が 0 でれば8進数、0x で始まれば16進数とみなされるからである。
また文字列については2つの定義法がある。シングルクォート(')によって囲まれたシングルクォート文字列(single-quoted string)とダブルクォート(")によって囲まれたダブルクォート文字列(double-quoted string)である。
シングルクォート文字列では、基本的にシングルクォートで挟まれた間の文字列はそのまま変数の値となる。例外はシングルクォート文字列内にシングルクォートそのものが含まれる場合とバックスラッシュ(日本語環境下では \ )が含まれる場合のみである。前者の場合は逆スラッシュをシングルクォートの前に置く。バックスラッシュは「直後に特殊な文字を置く」ということを示す記号である。そのためバックスラッシュ自体を文字として使いたい場合にもバックスラッシュを置く。したがって後者の場合にはバックスラッシュを2つ続けることになる。
表記 $var の値 $var = 'X\'mas'; X'mas $var = 'hoge\\hoge'; hoge\hoge $var = 'Hello, World!\n'; Hello, World!\n
シングルクォート文字列では上記の2つの場合以外は「バックスラッシュ+何か」は特殊な意味を持たない。例えば上の例では \n は「改行」を意味しない。
ダブルクォート文字列では、その文字列の中で変数展開(variable interpolation)やエスケープシーケンスによる制御が可能となる。
まず変数展開とは、ダブルクォート文字列内にスカラ変数があった場合、その時点におけるスカラ変数の値で置換することである。例えば以下のようになる。
表記 文字列 の値 $a = "Hoge Hoge."; Hoge Hoge. $b = "My name is $a"; My name is Hoge Hoge. $c = "My name is $d"; My name is
$b ではその時点で $a には「Hoge Hoge.」という値が設定されているため、値が展開されている。これに対し $c ではこの時点では $d に値が設定されていないため何も表示されない。
次にエスケープシーケンスとは、文字列内で特殊な操作を行うときに宣言する文字列である。以下のようなものが準備されている。
表記 意味 \n 改行 \r 復帰 \t タブ \f 改ページ \b バックスペース \v 垂直タブ \a ベル \e エスケープ \007 8進数表現(この場合は 007:ベル) \x7f 16進数表現(この場合は 7f:削除文字) \cC コントロール文字(この場合は ctrl+C) \\ バックスラッシュ \" ダブルクォート \l 次の1文字を小文字にする \L \E までの文字を小文字にする \u 次の1文字を大文字にする \U \E までの文字を大文字にする \E \L と \U の効果を終了させる。
配列変数は複数のスカラー値に順序をつけて格納したものである。配列変数の各要素はスカラ変数である。したがってスカラ変数で成立することは配列変数でも成立する。また配列の各要素は定数でなくてもよく、式であってもよい。また全てが同じ型(文字・数値)である必要もない。
配列に値を代入する際には()で囲った値のリストを用いる。
@aaa = (1,2,3);
配列同士であれば直接複写することができる。例えば次の式では配列 @bbb の中身は @aaa と同じになる。ただし先に @bbb が定義されおり、大きさ(配列の長さ)が一致しない場合には、余るほうが無視される。代入する側のほうが少なければ、代入されない値には undef が設定される。
@bbb = @aaa;
配列にスカラー値を代入すると、値を1つしかもたない配列となる。
@ccc = 1;
つまり上の式は以下の代入をしたことに等しい。
@ccc = (1);
配列の要素に別の配列を指定することもできる。またリスト構成演算子を用いて2個のスカラの間にピリオドを2つ連続して記すと、左のあ値を始値、右の値を終値とした範囲でリストを生成する。したがって下の式の結果は @bbb = (1,2,3,4,5,6) となる。
@bbb = (@aaa,4..6);
リスト構成演算子を用いる場合は、右の値が左の値より小さい場合は空リストを返すので注意が必要である。また与えられた値が整数でない場合も、右の値を超えない値までしか追加されない。
配列変数をスカラ変数に代入した場合(これを「配列をスカラコンテキストで使う」と言う)には、配列の大きさを返す。すなわち、
$c = @bbb;
とすると、 $c の値は 6 である。
配列要素へのアクセス
配列全体ではなく個々の要素の値を取得したり設定したりしたい場合には、[]を用いて指定する。なお、配列の添字は 0 から始まる。すなわち配列 @aaa の最初の要素は $aaa[0] で示される。さて、配列の各要素はスカラであるから、要素を示す変数がスカラ変数で示されていることに注意が必要である。
もし $aaa[0] のつもりで @aaa[0] と書いた場合、これはスライス(slice)と呼ばれ、配列の要素を並べたリストを示す。すなわち
@aaa = (1,2,3);
であれば
表記 意味 $aaa[0] 1 (←これはスカラ) @aaa[0] (1) (←これは長さは1だが配列)
このスライス記法は配列中の複数の要素を取り出して処理するときに用いられる。例えば配列の最初の2つの要素を入れ替えるには以下のように記す。
@aaa[0,1] = @aaa[1,0];
ハッシュ(hash)とは連想記憶(associated memory)と呼ばれることもある。配列が数字(インデクス)で順序付けられているのに対し、あるスカラを指定したときに関連付けられたスカラを返すことができる。ハッシュではインデクスの代わりにキー(key)を指定する。
例えば、以下のようにキーと値が与えようとしていたとする。
キー 値 Sun Sunday Mon Monday Tue Tuesday Wed Wednesday Thu Thursday Fri Friday Sat Saturday
この場合、配列と同様に考えると以下のように指定することもできる。
%Longname = ();
$Longname(Sun) = "Sunday";
$Longname(Mon) = "Monday";
$Longname(Tue) = "Tuesday";
$Longname(Wed) = "Wednesday";
$Longname(Thu) = "Thursday";
$Longname(Fri) = "Friday";
$Longname(Sat) = "Saturday";
これを1行で次のように書くこともできる。
%Longname = ("Sun", "Sunday", "Mon", "Monday", "Tue", "Tuesday", "Wed", "Wednesday", "Thu", "Thursday", "Fri", "Friday", "Sat", "Saturday");
…が、これでは見にくいので次のように書くとよい。
%Longname = (
"Sun" => "Sunday",
"Mon" => "Monday",
"Tue" => "Tuesday",
"Wed" => "Wednesday",
"Thu" => "Thursday",
"Fri" => "Friday",
"Sat" => "Saturday"
);
格納したハッシュ値を呼び出すときには配列のように指定する。
$a = %Longname(Sun);
このとき $a には Sunday という値が格納される。
同じ識別子を持つ変数(スカラ・配列・ハッシュ・サブルーチン)を一括して表すもの…という説明があるのだけれど、実はよくわからん。例えば
$a = "Hello World";
@a = (1,2,3,4);
というスカラ・配列・ハッシュ・サブルーチンがあったときに
*b = *a;
と呪文を唱えると、スカラ $b の値は "Hello World" に、配列 @b には (1,2,3,4) が格納されているそうだが、これ以外の、「そうか、こういうときに使うんだ!!」と目から鱗を落としてくれるような説明を見たことがない。
ごめん、いい説明が見つかるまで待ってくれい。
![]() |
Updated : 2006/11/08 |