※ここの解説は、後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
■ 8.変数と繰り返し
次は、Perlで使用する変数について説明します。
ここら辺から、少しずつプログラムの要素が入ってきます。
CGIを作成しようとすると、いろんな数値や文字列などを記憶しておかなければならない場合があります。
そのときに、それらを仮に覚えておくもののことで、電卓のメモリーのような機能として使われます。
CGIを作成する上で必ず必要になる機能ですのでしっかり覚えておいてください。
■ Perlで使用する変数
Perlで使用できる変数のデータ型は、大きく3つあります。
種類 | 説 明 |
スカラー | 数値、文字列など単純な変数 名前の前に$を付ける |
配列 | スカラーを順序付けて並べた集合(配列変数) 名前の前に@を付ける |
ハッシュ | キーと値が一対になった順序付けられていないスカラーの集合(配列変数) 名前の前に%を付ける |
それぞれのデータ型で変数を表すと次のようになります。
- スカラー
-
記述例 意 味 $var 単純なスカラー $array[1] 配列@arrayの2番目の要素 $array[-2] 配列@arrayの最後から2番目の要素 $hash{'abc'} ハッシュ%hashのキーがabcの要素 $#array 配列@arrayの最後の要素の添え字 - 配列
-
記述例 意 味 @array 配列arrayの要素全体 @array[0,1,2] 配列@arrayの1番目、2番目、3番目の要素の組 (配列スライスと言う) @array[0..2] @array[0,1,2]と同じ @hash{ 'a','b','c' } ハッシュ%hashの、キーがa、b、cの要素の組 (ハッシュスライスと言う) @hash{ @list } 配列@listの要素をキーとした%hashの要素の組 (これもハッシュスライス) - ハッシュ
-
記述例 意 味 %hash ハッシュhashの要素全体 - リスト、リスト形式
-
記述例 (a,b,c) ('a','b','c') ('a','1','b','2')
また、上記「配列」や「ハッシュ」変数に直接、値を代入する場合はリスト形式で記述します。
リスト形式とはそれぞれの値を「,(カンマ)」で区切りながら「()(括弧)」で括ったものです。
それぞれの変数へ値をセットする場合の記述は次のとおり。
記述例 | 意 味 |
---|---|
$var = 'abc'; $var = "abc"; | 変数$varの値がabcになる |
$var = '$abc'; | 変数$varの値が$abcになる |
$var = "$abc"; $var = $abc; | 変数$varの値は変数$abcの値になる (変数展開される) |
@array = ('a','b','c'); @array = (a,b,c); | 配列@arrayの要素が1番目から順にa、b、cになる |
@array = @list[2..4]; | 配列@arrayに@listの3,4,5番目の要素がセットされる |
$hash{'a'} = "1"; $hash{'b'} = "2"; | %hash = ( 'a','1','b','2' ); と同義 ハッシュ%hashのキーaと対の要素に1が、キーbと対の要素に2がセットされる |
次にそれぞれの使用サンプルを記述します。
記述例 | 実行結果 |
---|---|
$var = 'abc'; print $var; $var = "abc"; print $var; | abc abc |
$var = '$abc'; print $var; | $abc |
$abc = "def"; $var = "$abc"; print $var; $var = $abc; print $var; | def def |
@array = ('a','b','c'); print $#array; print $array[0]; print @array[1]; print @array; @array = (a,b,c); print $#array; print $array[0]; print @array[1]; print @array; | 2 a b abc 2 a b abc |
@list = (a,b,c,d,e,f); @array = @list[2..4]; print @array; | cde |
$hash{ 'a' } = "1"; $hash{ 'b' } = "2"; $var = "b"; print $hash{ 'a' }; print $hash{ $var }; print %hash; | 1 2 a1b2 |
$hash{ 'a' } = "1"; $hash{ 'b' } = "2"; $hash{ 'c' } = "3"; @list = (a,c,b); print @hash{ @list }; print %hash; | 132 a1b2c3 |
■ 繰り返し制御
Perlで使用できる繰り返し制御は、大きく6つあります。
- while (条件式) { 実行文のブロック }
- 指定した条件と一致する間繰り返す 条件が一致しない場合処理をしない
- until (条件式) { 実行文のブロック }
- 指定した条件が一致するまで繰り返す 条件が一致した場合処理をしない
- do { 実行文のブロック } while (条件式);
- 指定した条件が一致している間繰り返す 条件が一致しない場合でも1回は実行される
- do { 実行文のブロック } until (条件式);
- 指定した条件が一致するまで繰り返す 条件が一致しない場合でも1回は実行される
- for (初期化式;条件式;増減式) { 実行文のブロック }
- 指定した条件と一致する間繰り返す 初期化式、条件式、実行文、増減式の順に実行される 条件が一致しない場合処理をしない
- foreach [スカラー変数] (リスト) { 実行文のブロック }
- リストの要素をスカラー変数にセットしながら実行文を繰り返す リストに要素がなければ処理を実行しない リストは配列変数も使用できる スカラー変数を省略した場合、特殊変数 $_ にセットされる
それぞれの使用サンプルを記述します。
記述例 | 実行結果 |
---|---|
$var = 1; while ($var < 5) { print $var," "; $var = $var + 1; } | 1 2 3 4 |
$var = 1; until ($var == 5) { print $var," "; $var = $var + 1; } | 1 2 3 4 |
$var = 1; do{ print $var," "; $var = $var + 1; } while ($var < 5) | 1 2 3 4 |
$var = 1; do{ print $var," "; $var = $var + 1; } until ($var > 0) | 1 |
for ($var = 1;$var < 5; $var = $var + 1) { print $var," "; } | 1 2 3 4 |
for ($i = 1,$j = 1;$i < 5; $i = $i + 1,$j = $j - 1) { print $i,"/",$j," "; } | 1/1 2/0 3/-1 4/-2 |
foreach $var (a,b,c) { print $var," "; } | a b c |
■ for()文の別の記述形式
for文には単純な数字の繰り返しである場合、もうひとつ、簡易的な記述方法があります。
1から10までを表示する通常の記述方法 for ($var = 1;$var <= 10;$var = $var + 1) { print $var," "; } 1から10までを表示する簡易的な記述方法 for $var (1..10) { print $var," "; }
■ 特殊な変数 $_
Perlの特殊変数はいくつもありますがその中でも特に重要な $_ について説明しておきます。
上記のforeach文の説明でもあったように、変数が記述されていない構文(命令文)がこれからも出てきます。
そういった場合、Perlは「無条件に $_ を使用する。」という決まりがあるのです。
また、変数の指示があっても $_ にはその処理の値がセットされる場合がほとんどです。
print命令もそのひとつです。
このことをよく覚えておいて下さい。
したがって、上記サンプルの
foreach $var (a,b,c) { print $var," "; }
は、
次のような3種類の記述方法に変更することができ、全て同じ結果になります。
foreach $var (a,b,c) { print $_ ," "; }
foreach (a,b,c) { print $_ ," "; }
foreach (a,b,c) { print; print " "; }