≫序章
変数とは、数学で習う X や Y と似たようなもので、情報の入れ物です。ただ、入れる情報によって型と呼ばれるものが変ってきます。例えば、数値を入れておくのと文字列を入れておくのとでは多少扱いが変ります。プログラミングに取り組み始めの頃はこの辺につまづきやすいのですが、慣れれば屁の様なもんです(^_^;)
しかも、Perl は数値だろうが文字列だろうが同じに扱える、すげーダイナミックな言語です。詳しくは後ほど述べていくとして、変数の扱いを色々知っていくと、いままで複雑な処理にしてしまいがちだったところを簡潔にコード化できたりします。
そういうわけで、変数についてざっくり解説してみようかと思います。
しかも、Perl は数値だろうが文字列だろうが同じに扱える、すげーダイナミックな言語です。詳しくは後ほど述べていくとして、変数の扱いを色々知っていくと、いままで複雑な処理にしてしまいがちだったところを簡潔にコード化できたりします。
そういうわけで、変数についてざっくり解説してみようかと思います。
≫スカラー変数ついて
スカラー変数は最も基本的な変数です。
$hoge = 7;
$page = "www.bayashi.net";
以上の様な使われ方をします。$hoge や $page がスカラー変数で、7 や " (ダブルクオート)で囲まれた部分が変数の値となります。
変数は $ が頭につき、変数名には英数字とアンダーバーが使えます。ただし、数字やアンダーバーが $ の直後に来るのはオススメできません。
変数に値を代入する場合、数値(半角)ならそのままで OK ですが、文字列の場合はクオートで囲まなければなりません。
$hoge = "www.bayashi.net";
$hoge = 'www.bayashi.net';
ダブルクオートでもシングルクオートでも基本的には同じですが、代入する文字列自体にダブルクオートやシングルクオートがある場合や特殊な記号が含まれる場合、エスケープする必要がでてきます。また、ダブルクオート内の変数は展開されて代入されますが、シングルクオート内の変数はただの文字列扱いとなります。
$a = "abc";
$hoge = "123$a";
$page = '123$a';
print "hoge = $hoge : page = $page";
出力結果 hoge = 123abc : page = 123$a
ヒアドキュメントと呼ばれる以下のような代入の仕方もあります。
$hoge = <<"_HTML_";
www.bayashi.net
_HTML_
ヒアドキュメントの場合も "_HTML_" の囲みがダブルクオートであるかシングルクオートであるかによってエスケープしなければならない記号や変数の展開に差があります。
$hoge = 7;
$page = "www.bayashi.net";
以上の様な使われ方をします。$hoge や $page がスカラー変数で、7 や " (ダブルクオート)で囲まれた部分が変数の値となります。
変数は $ が頭につき、変数名には英数字とアンダーバーが使えます。ただし、数字やアンダーバーが $ の直後に来るのはオススメできません。
変数に値を代入する場合、数値(半角)ならそのままで OK ですが、文字列の場合はクオートで囲まなければなりません。
$hoge = "www.bayashi.net";
$hoge = 'www.bayashi.net';
ダブルクオートでもシングルクオートでも基本的には同じですが、代入する文字列自体にダブルクオートやシングルクオートがある場合や特殊な記号が含まれる場合、エスケープする必要がでてきます。また、ダブルクオート内の変数は展開されて代入されますが、シングルクオート内の変数はただの文字列扱いとなります。
$a = "abc";
$hoge = "123$a";
$page = '123$a';
print "hoge = $hoge : page = $page";
出力結果 hoge = 123abc : page = 123$a
ヒアドキュメントと呼ばれる以下のような代入の仕方もあります。
$hoge = <<"_HTML_";
www.bayashi.net
_HTML_
ヒアドキュメントの場合も "_HTML_" の囲みがダブルクオートであるかシングルクオートであるかによってエスケープしなければならない記号や変数の展開に差があります。
≫配列変数について
配列変数とはスカラー変数に添字をつけて、連続した変数を一式で扱える便利な変数です。
1 愛川
2 今井
3 宇多田
4 江川
5 岡林
というリストがあった場合、
$name1 = "愛川";
$name2 = "今井";
$name3 = "宇多田";
$name4 = "江川";
$name5 = "岡林";
という風に、ひとつづつスカラー変数にするよりも
$name[1] = "愛川";
$name[2] = "今井";
$name[3] = "宇多田";
$name[4] = "江川";
$name[5] = "岡林";
という風に、配列変数にした方がなにかと便利です。
配列変数は、スカラー変数のデータ構造違いで、頭に @ をつけます。従って前述したリストの変数全体をあらわす場合は、
@name
となります。それぞれの要素を表す時は $name[n] という形になるのですね。[n] の添え字は [ ] で囲みます。添え字の数字は 0 からはじまります。
前述の5つの要素を定義するには以下のように書くことも出来ます。
@name = ("愛川","今井","宇多田","江川","岡林");
他にも、配列変数にはいろいろと面白い記述方があります。
| 表現 | 解説 |
|---|---|
| @hoge | 配列変数 @hoge 全体 |
| $hoge[3] | 配列変数 @hoge の4番目の要素 |
| $hoge[-1] | 配列変数 @hoge の最後の要素 |
| $#hoge | 配列変数 @hoge の最後の添字番号(添字は 0 から始まるので要素の数より 1 少ない値になります)。 |
| $page = @hoge; | スカラー変数に配列変数を代入すると要素数が代入されます。 |
| $#hoge = -1; @hoge = (); | どちらも @hoge を空にします。 |
| undef @hoge; | @hoge を未定義値にします。 |
@name = ("愛川","今井","宇多田","江川","岡林");
print @name;
出力結果 愛川 今井 宇多田 江川 岡林
print $name[2];
出力結果 宇多田
print $name[-1];
出力結果 岡林
print $#name;
出力結果 4
$a = @name;
print $a;
出力結果 5
さて、連想配列なんですが、ここまで説明したような1次元のものだけでなく、2次元や3次元のものもあります。
$name[0][0] = "愛川";
$name[0][1] = "今井";
$name[1][0] = "赤坂";
$name[1][1] = "石田";
$color[0][0][0] = "シアン";
$color[0][0][1] = "マゼンタ";
$color[0][1][0] = "イエロー";
$color[0][1][1] = "クロ";
ただ、Perl に限れば下で説明する連想配列の方が便利なので、多次元の配列変数を使う機会は少ないかもしれません。
配列変数を扱うための関数は以下の様なものがあります。
| 関数名 | 解説 |
|---|---|
| unshift |
配列の先頭に要素を追加する。 unshift(@hoge,"abc"); |
| push |
配列の末尾に要素を追加する。 push(@hoge,"abc"); |
| shift |
配列の先頭の要素を取り除く。 $str = shift @hoge; |
| pop |
配列の末尾の要素を取り除く。 $str = pop @hoge; |
| splice |
配列の要素を任意の位置で削除/追加します。 splice(@hoge,-1); |
| sort |
リストをソートします。 sort @hoge; sort {$a <=> $b} @hoge; # 数値昇順ソート sort {$a cmp $b} @hoge; # 文字列の昇順ソート |
| reverse |
リスト値を逆順に並び替える。 @page = reverse @hoge; |
| split |
文字列を分割する。 @hoge = split(/\t/,$str); |
| join |
区切り文字列を挟んで文字列を連結します。 $str = join("\t",@hoge); |
| grep |
要素を評価し、真になった要素を返す。 @page = grep(/^a/,@hoge); |
| map |
要素を評価し、結果を返します。 map{ s/abc/def/ } @hoge; |