にししの Perl/CGI Tips ふぁくとりー
Perlを使ったCGIの作成に関する、ちょっとしたTIPSをご紹介しています。
既存CGIのカスタマイズから、CGI改造・新しいCGIの作成などにお役に立つかも知れません。(^^;)
私が今までにPerlでCGIを作成してきた中で、いろいろ便利だと思ったソースコードなどを掲載しています。
ここでご紹介するソースやサンプルCGIは、すべて使用フリーですので、ご自由にご活用下さい。
もっと良いテクニックがあれば、ぜひ教えて下さい。(^^;)
日付関連TIPS
- 日付から曜日を割り出す 2004/02/18.Wed.
- タイムゾーンを指定して日付・時刻を得る 2004/03/04.Thu.
配列関連TIPS
- 配列の中身すべてに対してループで何か処理をする 2004/02/19.Thu.
- 配列の中身を降順・昇順にソートする 2004/02/24.Tue.
- 配列の中身をクリアするには? 2004/02/26.Thu.
サブルーチン関連TIPS
- サブルーチンに渡された引数を得る 2004/02/20.Fri.
- サブルーチン内だけで使える変数(ローカル変数)を作る 2004/03/02.Tue.
文字列操作関連TIPS
- 文字列を特定の文字で分割する 2004/02/21.Sat.
- 文字列から改行を取り除く 2004/02/23.Mon.
- ディレクトリ名を取り除いてファイル名だけを抜き出す 2004/02/28.Sat.
- HTMLタグを取り除く 2004/03/01.Mon.
ファイル操作関連TIPS
- ファイルを開いて降順でソートしてから配列に格納 2004/02/25.Wed.
- ファイルが開けなかった場合に何か処理をするには? 2004/02/27.Fri.
- ファイルに追記するには? 2004/03/03.Wed.
Perlスクリプト全般のTIPS
- 別ファイルのPerlスクリプトにあるサブルーチンを呼び出して使用する 2004/02/22.Sun.
- GETでもPOSTでもどちらでもパラメータを受け取れるようにする 2004/02/29.Sun.
各カテゴリの新着TIPS
各カテゴリの新着TIPSを、1つずつ掲載しています。
日付関連TIPS
日付から曜日を割り出す
ある日付が一体何曜日なのか知りたいと思うことはありませんか?
計算で求めなくても、Perlの2つの関数を使えば、西暦で日付を指定するだけで曜日を得ることができます。
SOURCE 1
timelocal関数で西暦をエポック秒に変換し、localtime変数で各種日付情報に戻します。その際、曜日情報も得られます。
use Time::Local;
$time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year);
($sec,$min,$hour,$mday,$mon,$year,$wday,$dmy) = localtime($time);
@wdays = ("日","月","火","水","木","金","土");
print "$year年$mon月$mday日は、" . $wdays[$wday] . "曜日です。\n";
timelocal関数を使うためには、最初に「use Time::Local;」と書いておく必要があります。
SOURCE 2
もっと短く書けば次のようになります。
$wday = localtime( timelocal(0, 0, 0, $mday, $mon - 1, $year) )[6];
@wdays = ("日","月","火","水","木","金","土");
print "$year年$mon月$mday日は、" . $wdays[$wday] . "曜日です。\n";
timelocalの返り値を変数に代入せずに、直接 localtimeの引数に渡しています。また、localtimeの返り値はたくさんあるので、そのうち必要な1つだけを得られるよう [6] を加えています。
SAMPLE SOURCE
2004/02/18. Wed.
配列関連TIPS
配列の中身すべてに対してループで何か処理をする
配列に格納したデータすべてに対して、ループを回して何か処理をしたい場合が良くあります。
配列の長さを取得して for文で回す…という手が他の言語ではよく使われるでしょうが、Perlにはもっと便利な foreach文があります。
SOURCE 1
foreach の使い方はとても簡単。「
foreach 変数 ( 配列 )
」です。
@moes = ("sakura", "tomoyo", "misaki", "rakka", "sora");
foreach $moe ( @moes ) {
print "名前:$moe\n";
}
配列 @moes の中身が $moe に入ります。@moes に要素があるだけループが回ります。配列の長さを調べる必要がないので楽ですね。
SOURCE 2
配列の番号が必要になる場合は、for文を使って次のように書けます。
@moes = ("sakura", "tomoyo", "misaki", "rakka", "sora");
for( $loop=0 ; $loop <= $#moes ; $loop++ ) {
$num = $loop+1;
print "$num人目の名前:$moes[$loop]\n";
}
配列の最後の要素番号が $#配列名 で分かります。また、配列 @moes の特定の要素は $moes[番号] で得られます。
SAMPLE SOURCE
2004/02/19. Thu.
サブルーチン関連TIPS
サブルーチンに渡された引数を得る
サブルーチンに渡された引数は、すべてまとめて @_ 配列に格納されています。
ですから、引数を受け取るには、この @_ 配列の中身を見れば良いわけです。
SOURCE 1
名前が特別ですが、通常の配列と同じですので、通常の配列を扱うように扱えます。
例えば、 shift を使って、1個ずつ取り出す方法があります。
例えば、 shift を使って、1個ずつ取り出す方法があります。
sub subroutine {
$param1 = shift @_;
$param2 = shift @_;
$param3 = shift @_;
:::
}
shiftを使えば、配列の先頭の要素から1つずつ抜き出すことができます。
SOURCE 2
1つずつ抜き出すような面倒なことをせずに、一気に全部抜き出すこともできます。
( $param1, $param2, $param3 ) = @_;
上記の場合は、引数が3つある場合です。いくつでも増やせます。必要なだけ列挙すれば良いわけです。
SOURCE 3
引数が1個しかないのなら...
$param = @_;
こういう書き方もできますね。(^^;)
2004/02/20. Fri.
文字列操作関連TIPS
文字列を、特定の文字で分割する
カンマ区切りの文字列を、カンマで分割したいと思うことは良くあります。カンマの他にもスラッシュやハイフンなど、様々な場合があるでしょうね。
そのどんな場合にも使える split という関数があります。
SOURCE 1
split の使い方はとても簡単。「
split /パターン/ , (対象文字列)
」です。
($first, $second, $third, $fourth ) = split(/,/, $string );
上記は、変数 $string 内の文字列をカンマで区切って、$first 〜 $fourth までの4つの変数に分割して格納しています。
SOURCE 2
($first, $second, $third, $fourth ) = split(/-/, $string );
上記は、ハイフンを区切り文字として分割した場合です。
SOURCE 3
スラッシュを区切り文字にする場合は...
($first, $second, $third, $fourth ) = split(/\//, $string );
スラッシュの前に、「¥」を加えて「\/」と書く必要があります。
2004/02/20. Fri.
Perlスクリプト全般のTIPS
別ファイルのPerlスクリプトにあるサブルーチンを呼び出して使用する
複数のCGIで共通して使いたいサブルーチンなどは、別ファイルに独立させるのがスマートですね。
別ファイルにあるサブルーチンを呼び出して使う仕組みが、Perlには用意されています。
SOURCE 1
まず、呼び出される方のPerlスクリプトに、パッケージ名を付けます。
#! /usr/bin/perl
package samplepackage;
sub function1 {
print "hogehoge\n";
}
1;
上記では、samplepackage というパッケージ名を付けています。そして、function1 というサブルーチンを記述しています。
また、最後に必ず「真」を返さないといけない決まりになっているので、ソースの最後に「1;」と書いて、真を返すようにしています。
また、最後に必ず「真」を返さないといけない決まりになっているので、ソースの最後に「1;」と書いて、真を返すようにしています。
SOURCE 2
次に、呼び出す方のPerlスクリプト。
require '(ファイル名)';
と記述することで、別ファイルのPerlスクリプトを呼び出すことができます。
require 'sample.cgi';
samplepackage::function1();
上記では、sample.cgi というファイルを呼び出して、function1 というサブルーチンを実行しています。
サブルーチンの前に「samplepackage::」という記述がありますが、これを付けることで、「パッケージ samplepackage 内のサブルーチン」という意味になります。
ですから、複数のPerlスクリプトを呼び出して、それぞれに同じ名称のサブルーチンがあったとしても、正しく目的のサブルーチンを呼び出して使うことができます。
サブルーチンの前に「samplepackage::」という記述がありますが、これを付けることで、「パッケージ samplepackage 内のサブルーチン」という意味になります。
ですから、複数のPerlスクリプトを呼び出して、それぞれに同じ名称のサブルーチンがあったとしても、正しく目的のサブルーチンを呼び出して使うことができます。
2004/02/21. Sat.
このページに記載の内容は、必ずしも正しいとは限りません。ご注意下さい。
もっと良い方法がありましたら、ぜひ、教えて頂けるとありがたいです。
製作者にししへのご連絡は、メールなどでお送り下さい。匿名のコメントも送信できます。
どのページへもリンクは歓迎します。複製・転載はご遠慮下さい。
Copyright © 2004 Fumihiro-Nishimura.(Nishishi) All rights reserved.
[Your access date]2023年02月03日
[Modified date]2007年04月17日