※ここの解説は、後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
■ 11.文字列の抽出とif文
さて、今回は前回で少し問題が出ましたので受け取ったパラメータによりCGIの処理内容を変更する方法を説明します。
前回で上がった問題は、「そのファイルがHTML形式ならそのまま表示してもよいが、HTML以外なら<BR>タグを追加表示させないといけない」というものです。
そこで、今回は2つの命令を説明します。
1つは文字列の中から任意の部分を抽出する方法と、条件により処理を変更するという方法です。
まず、取得したパラメータがHTMLのファイル名かどうかを判断しないといけませんので、パラメータの最後が
.htm か .html であればHTMLファイルと判断するようにします。
そこで取得したパラメータの末尾4文字か5文字を抽出しないといけないということになります。
■ 文字列の抽出
文字列の中から任意の文字を抽出するには、substrという関数を使用します。
substr関数の記述は次のとおりです。
substr(文字列,開始位置[,長さ])
長さは省略することが可能です。
開始位置がマイナスの場合は、文字列の最後から取得します。
開始位置は、1文字目の場合 0 で、最後の文字は -1 になります。
長さがマイナスの場合最後からその文字分をカットします。
また、= の左辺に記述しますと指定した文字列を右辺の文字列で置換することもできます。
実行サンプルは次のようになります。
記述例 | 意 味 |
---|---|
$a = 'abcdef'; print substr($a,2),"<BR>"; print substr($a,-2),"<BR>"; print substr($a,1,3),"<BR>"; print substr($a,-3,2),"<BR>"; print substr($a,-4,-2),"<BR>"; $b = substr($a,3); print $b,"<BR>"; $b = $a; substr($b,1) = "xyz"; print $b,"<BR>"; $b = $a; substr($b,1,3) = "xyz"; print $b,"<BR>"; $b = $a; substr($b,1,2) = "xyz"; print $b,"<BR>"; $b = $a; substr($b,1,4) = "xyz"; print $b,"<BR>"; $b = $a; substr($b,-4,-2) = "xyz"; print $b,"<BR>"; | 3文字目から最後までを取得 cdef 最後の2文字を取得 ef 2文字目から3文字を取得 bcd 最後の3文字の内2文字を取得 de 最後の4文字から最後の2文字を カットして取得 cd 4文字目から最後までをセット def 2文字目から最後までを置換 axyz 2文字目から3文字を置換 axyzef 2文字目から2文字を置換 axyzdef 2文字目から4文字を置換 axyzf 最後の4文字から最後の2文字を カットした部分を置換 abxyzef |
これで、文字列の中から任意の文字を抽出することができます。
次に、ある条件を指定して処理を変える方法です。
■ if文
条件を指定した分岐は、ifを使用します。
if関数の記述は次のとおりです。
記述例 | 解 説 |
---|---|
if (条件式) { 実行文のブロック } | 条件式がひとつの単純なif文 |
if (条件式) { 実行文のブロック } else { 実行文のブロック } | 条件式を満足させる場合とそれ以外の処理を行うif文 |
if (条件式) { 実行文のブロック } elsif (条件式) { 実行文のブロック } else { 実行文のブロック } | 条件式が複数ある場合のif文 |
さて、予備知識が付きましたらさっそく前回のサンプルを変更してみましょう。
■ パラメータにより処理を変えるCGI
パラメータの最後の4文字を取得するには次のようになります。
substr($param,-4)
そして、これが .htm と等しいかどうかを比較するには文字列比較演算子を使用して次のように記述します。
substr($param,-4) eq ".htm"
同様に、最後の5文字が .html と等しいかどうかを比較するには次のように記述します。
substr($param,-5) eq ".html"
次に「この2つの条件のどちらかを満足する」という条件式は、以前習った論理演算子のOR条件を使用して次のように記述します。
(substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html")
区切りがわかりやすいように条件式には ( ) を使用して括っておきます。
さらに、上記の条件を満足しない場合の条件式は、次のように記述します。
not ( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") )
一番外側を not( ) で括り、わかりやすく改行をしました。
したがって、サンプルは次のようになります。
- 【記述サンプル】
- #!/usr/bin/perl $param = @ARGV[0]; if ( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) { print "Content-type:text/html\n\n"; } else { print "Content-type:text/plain\n\n"; } open(FILE, "<$param"); while(<FILE>){ print; if ( not( (substr($param,-4) eq ".htm") or (substr($param,-5) eq ".html") ) ) { print "<BR>"; } } close(FILE);
上記のサンプルで変更したところは、
「print "Content-type〜」 をif文により2種類の処理を切り分けするようにしたのと
「print "<BR>";」 をHTML文章以外のときのみ実行するようにしました。
なお、見やすいように適度に改行を挿入しています。
これで、完成です。