perlでCGIを書く(2)
変数
情報が書かれたメモのようなものです。メモには数値や文字列が書かれますが、いつでも自由に書き替えることができます。
他の言語では、情報の内容ごとに書くべきメモ用紙が決められています(電話番号は電話番号専用のメモ用紙、住所は住所専用のメモ用紙など)が、perlの場合はその場の状況(コンテキスト)によって臨機応変に対応します。
これを利用すると;
配列をリストコンテキストで評価した際には、各要素の値が配列の値になります。スカラーコンテキストで評価した際には、要素の個数を値に持ちます。
@_はデフォルトです。
書式は(キー1,値1,キー2,値2, ...)です。
参照する際は、$(ハッシュ名){'(キー名)'}で値を呼び出します。デコードの欄で触れた $in{$key}=$value というのは、このハッシュです。
他の言語では、情報の内容ごとに書くべきメモ用紙が決められています(電話番号は電話番号専用のメモ用紙、住所は住所専用のメモ用紙など)が、perlの場合はその場の状況(コンテキスト)によって臨機応変に対応します。
スカラー変数
ひとつの変数は、ひとつの値を持ちます。
- $a = 657;
- $aというスカラー変数に、数字の657が代入されます。
- $b = $a + 100; → $bの値は757になります。
- $c = "657";
- $bというスカラー変数に、文字列の657が代入されます。
- print "$b番地"; → "657番地"と表示されます。
配列
ひとつの配列は、複数の値を持ちます。
- @p = (65, 80, 120);
- @pには、それぞれ65,80,120の値が代入されます。
これを利用すると;
@p = (65, 80, 120);
print "平日は半額!\n";
foreach(@p) {
print "$_円!\n";
}
というプログラムが書けます。配列をリストコンテキストで評価した際には、各要素の値が配列の値になります。スカラーコンテキストで評価した際には、要素の個数を値に持ちます。
@_はデフォルトです。
ハッシュ
以前は「連想配列」と呼ばれていました。これは配列の要素を呼び出すキー名と要素そのものを対にして記憶させ、キー名で参照しようとするものです。書式は(キー1,値1,キー2,値2, ...)です。
参照する際は、$(ハッシュ名){'(キー名)'}で値を呼び出します。デコードの欄で触れた $in{$key}=$value というのは、このハッシュです。
%family = ('bon','雄猫'
,'mee','雌猫'
,'bonmee','地球外生命体');
print $family{'bon'};
実行すると、"雄猫"と表示されます。演算
CGIで比較的よく使われる演算。
四則演算;
- $a + $b ・・・ 加算
- $a - $b ・・・ 減算
- $a * $b ・・・ 乗算
- $a / $b ・・・ 除算
- $a % $b ・・・ $aを$bで割った余り
$a=13, $b=5の場合、解は"2余り3"なので"3"を返す。 - $a ** $b ・・・ べき乗
$a=5, $b=3の場合、解は"5の3乗"で"125"を返す。
比較演算;
- $a == $b ・・・ $aと$bは数値が等しい
- $a != $b ・・・ $aと$bは数値が等しくない
- $a eq $b ・・・ $aと$bは文字列が等しい
- $a ne $b ・・・ $aと$bは文字列が等しくない
- $a < $b ・・・ $aは$bより大きい
- $a > $b ・・・ $aは$bより小さい
- $a =~ /$b/ ・・・ パターンマッチ
- $a !~ /$b/ ・・・ パターンマッチの否定
論理演算;
- $a && $b ・・・ $aと$bの論理積
- $a and $b ・・・ perl5での論理積
- $a || $b ・・・ $aと$bの論理和
- $a or $b ・・・ perl5での論理和
- !$a ・・・ $aの論理否定("$aではない"の意)
- $a.$b ・・・ $aと$bの文字列を結合
その他;
- $a++ ・・・ $aをインクリメントする
- $a-- ・・・ $aをディクリメントする
制御構造
条件分岐
与えられた式を評価して、その結果で処理を分岐する方法。
if($name) {
print "$nameさん、ようこそ";
} else {
print "名前を入力して下さい";
}
もしも$nameの値が"bonmee"なら"bonmeeさん、ようこそ"と表示されますが、$nameが空白の場合は入力を促されます。"〜ではなく、〜だったら"という場合はelsifを用いて分岐します。
if($gender eq "male") {
print "カノジョ募集中";
} elsif($gender eq "female") {
print "彼氏が欲しいの";
} else {
print "性別は問いません(^^";
}
if〜文の反対の評価(もし〜でなければ)はunlessです。ループ
与えられた式が成立している(いない)間、同じ処理を繰り返すもの。a) for
(式1; 式2; 式3)が書式です。式1に始まり、式2を評価し、式3を評価してから以下を実行します。式2が成立しなくなった時点でループを抜けます。
for($i=1; $i==10; $i++) {
print $i;
}
$iの値を1から10までひとつずつインクリメントしながら、順に$iの値を表示します。b) while
()内の条件が成立しなくなった時点でループを抜けます。
$i = 1;
while($i<=10) {
print $i;
$i++;
}
結果は上のfor文と同じです。whileと逆の評価で動くのはuntilです。
c) foreach
配列の各要素を先頭から順にスカラー変数に代入します。配列がundefを返した(要素がなくなった)時点でループを抜けます。
@p = (65,80,120)
foreach(@p) {
print;
}
$_の値が順に65,80,120と変化し、続けて出力されます。ループ制御
a) last
その場でループを抜けます。
while(<FILE>) {
last if /^$/;
print;
}
ファイルの中身をプリント中ですが、空白行が来た瞬間ループを抜けます。b) next
処理中のループを中断して、ブロックの最後に飛びます。
$i = 1;
while(<FILE>) {
next if($i == 5);
print "$name[$i]";
$i++;
}
$name[5]を表示せず、$name[6]以下は再び表示されます。c) redo 処理中のループを中断して、次のブロックの先頭に飛びます。
上記のnextを単純にredoに書き替えると、$iがインクリメントされず無限ループになります。
下記のように書くと同じ動作をします。
$i = 0;
while(<FILE>) {
$i++;
redo if($i == 5);
print "$name[$i]";
}
サブルーティン
perlではサブルーティンは関数と同義です。
サブルーティンはいつでも勝手に宣言してよく、スクリプト中のどこに置かれても構いません。外部ファイルからモジュールとして呼び出しても構いませんし、クロージャを使って実行される時だけサブルーティン化しても構いません。
呼び出されたサブルーティンは、プログラムを実行し戻り値を返します。
上記のサブルーティンを呼び出す際には、取得するファイルのURLを$urlという変数に格納して引数で渡す必要があります。
ひとつのサブルーティンのみ扱う短いスクリプトなら問題にならないでしょうが、少し大きくなった時にグローバル変数をサブルーティン内で使用していると、瞬時に自分でも解読不能のプログラムが出来上がります。グローバル変数を使用する明確な根拠がない限り、避けた方が無難でしょう。
サブルーティンはいつでも勝手に宣言してよく、スクリプト中のどこに置かれても構いません。外部ファイルからモジュールとして呼び出しても構いませんし、クロージャを使って実行される時だけサブルーティン化しても構いません。
呼び出されたサブルーティンは、プログラムを実行し戻り値を返します。
宣言と定義
sub httpget {
local($get, $cat);
$get = `fetch $url`;
$url =~ s/http\:\///g;
$url =~ s/\/.*\///g;
$url =~ s/\///g;
$cat = `cat $url`;
return $cat;
}
sub サブルーティン名 {プログラム} の書式で宣言と定義を行います。呼び出し
通常は &サブルーティン名 で呼び出されるのが慣例です。上記のサブルーティンを呼び出す際には、取得するファイルのURLを$urlという変数に格納して引数で渡す必要があります。
例)&httpget($url);サブルーティンから同じサブルーティンをリカーシブに呼び出すことができます。
sub search {
@files = sort(glob("*"));
foreach(@files) {
if(-d) {
print;
++depth;
chdir($_);
&search($depth);
chdir("..");
--$depth;
}
}
}
引数
サブルーティンの引数は、一般的に@_からリストとして渡されます。@_はサブルーティン内でローカル宣言された変数と同じスコープを持ちますので、呼び出し元の@_(もともとの@_)もサブルーティン内より参照できます。ローカル変数
local()関数またはmy()関数で変数をローカル宣言しておくのが通例です。特にリカーシブルに呼び出す場合、間違いなく変数名はぶつかりますので忘れないようにしましょう。ひとつのサブルーティンのみ扱う短いスクリプトなら問題にならないでしょうが、少し大きくなった時にグローバル変数をサブルーティン内で使用していると、瞬時に自分でも解読不能のプログラムが出来上がります。グローバル変数を使用する明確な根拠がない限り、避けた方が無難でしょう。
戻り値
スカラー値の戻り値として返されます。最後に評価された式の値か、もしくはreturn(引数)で指定された引数の値が戻ります。
[ CGI Top ]
[ BACK ]
[ Reference Top ]
[ NEXT ]
[ HOME ]