Perlリファレンス

正式にはPractical Extraction and Report Languageといいます。CGI を利用したWebページのカウンタや掲示板などでよく使われるインタプリタ型のプログラム言語で、 UNIXやWindowsなどの多種のプラットフォームの上で動作します。よくCGI =Perlとひとくくりにされることが多いですがCGIは仕組みそのものであってプログラムではないので誤解しないように。
  1. 基礎知識
  2. ファイルの操作
  3. アクセス元(referrer)の取得
  4. バージョンの取得
  5. ””のコード内に””を使用する
  6. 日本語の文字コードを変換(jcode.pl Jcode.pm Encode.pm)
  7. 分岐式if(もし~ならば)の使用例
  8. 置き換え
  9. 配列の先頭(末尾)にデータ追加
  10. 配列の要素数の取得
  11. パーミッション(アクセス権)を変更
  12. ファイルの所有者とグループを変更
  13. シングルクォーテーションとダブルクォーテーションの違い
  14. 正規表現
  15. エラー処理
  16. 特殊変数
  17. フォーマット(表示形式)の変換
  18. 排他制御(ファイルロック)
  19. 環境変数の利用
  20. 文字化けする文字

基礎知識

Perlの実行はコマンドライン上かWeb上で行えます。

記述の仕方

コマンドライン上で実行

perl test.cgi ファイルを指定して実行

perl -e "print 'Hello world'" オプション-eでクォートで囲まれた範囲をスクリプトとして実行

perl -v test.cgi Perlのバージョン表示

perl -cw test.cgi ファイルの構文チェック

オプション-cでコンパイルを行い問題なければsyntax OKと表示。
オプション-wでエラー時に原因と思われる怪しい個所の警告文が表示されます。

Web上で実行

Perlプログラムの作成は基本的にテキストベースで行い最初の行(1行目)にPerlのあるフルパスを記述します。

一般的にサーバーがUnix系の場合
#!/usr/bin/perl や #!/usr/local/bin/perl
Windows系だとActivePerlを標準でC:\Perl\にインストールされていれば
#!C:/Perl/bin/perl になります。

コマンドライン上での実行と同様にオプションも使えます。 あとはこの記述以降にプログラム内容を記述していきます。

※Web上で実行するには当然ながらWebサーバーでCGIの実行が許可されていないといけません。 ホームページスペースをレンタルされている方はサーバーのサイトなどで確認してください。 Webサーバーを運営されている方でApacheやAN HTTPDを使用している場合は Webサーバーを作るを参照。

コメントアウト

作成日時やプログラム内容の補足文などプログラム文と認識させないコメント文。

一行の場合

# ここにコメント

複数行の場合

=pod
 ここにコメント
=cut

表示する(出力)

(例)print "Content-type: text/html\n\n";
   print "ここを表示"    

変数の種類

Perlでは変数名の先頭にプレフィクスと呼ばれる記号をつけることで変数として認識します。 基本的な変数の代表は、スカラー、配列、ハッシュ(連想配列)です。

スカラー $

変数を一つ格納できる。
(例)$abc = "あ";
※スカラーは数字で始まったりハイフンは使用することはできない。 ※$$abcのような可変変数なるものもあるがあまり使わない(おすすめしない)ので省略。

配列 @

変数を複数格納できる。配列に格納された変数のことを要素ともいい、その数を要素数という。 要素(変数)は格納された順に番号が割り振られておりその番号のことを添字(数字インディックス)という。 添字を使うことで格納された変数で特定の変数のみ取得することができる。 なお、添字は0から始まるので要素数-1が添字の最大値になる。
(例)@abc = ("あ","い","う","え","お");
   $abc[3]で「え」が取得される。

ハッシュ %

連想配列ともいい、変数を複数格納できる。キーと変数が対になりキーを指定して各要素を取り出す。

my %hash = ('one' => 1, 'two' => 2); キー => 変数 または キー , 変数 でもOK
print $hash{'two'} キーtwoで変数2がプリント

リスト

複数のスカラ変数を並べた構造をリストといいます。
(例)("あ","い","う","え","お") や (1,2,3,4,5)など
配列に格納するときなどで使用。

ファイルの操作

ファイルにアクセスするにはopen関数を使用します。open関数でアクセスするファイルに対して 読み込みなのか書き込みなのか、または読み書きなのかを指定し、アクセスしたファイルを ファイルハンドル(オープンしたファイルを表わす変数で基本は大文字で指定)に関連付け、 ファイルハンドルを通してファイルに対して処理を行います。 処理が終わったら開いたファイルをclose関数を使って閉じます。 開けたら閉める、これ大人のマナー。どこかで聞いたセリフ(汗)。 またファイル名の変更はrename関数、ファイルの削除はunlink関数を使用します。
open関数 open(FILE , "ファイル名")   読み込み(ファイルが存在しなければエラー)
open(FILE , "<ファイル名")   上記と同じ(ファイルが存在しなければエラー)
open(FILE , "+<ファイル名")   読み書き(ファイルが存在しなければエラー)
open(FILE , "+>ファイル名")   上書き読み書き(ファイルが存在しなければ新規作成)
open(FILE , ">ファイル名")   上書き書き込み(ファイルが存在しなければ新規作成)
open(FILE , ">>ファイル名")   追記書き込み(ファイルが存在しなければ新規作成)

close関数 close(FILE);

使用例 @abc = ("あ","い","う","え","お");
open(FILE , "+<log.txt")|| die print"File Open Error";
@data = <FILE>;ファイルのデータを配列に代入
unshift(@data,"$referer,$time_put,\n");配列の先頭にデータ追加
truncate(FILE,0);ファイルサイズを0バイトに(初期化)
seek(FILE,0,0);書き込み位置を先頭に指定
print FILE @data;ファイルへ書き込み
close(FILE);

ファイル名の変更 rename "変更前のファイル名", "変更後のファイル名"

ファイルの削除 unlink "ファイル名";

ファイル(ディレクトリ)の存在確認 ファイル演算子の-eでファイル(ディレクトリ)の存在の有無を確認できる。
if( -e ファイル名) {
print "ファイルあり\n";
} else {
print "ファイルなし\n";
}
※ファイル演算子-sでファイルサイズ取得

アクセス元(referrer)の取得

$referer=$ENV{"HTTP_REFERER"};

またはHTMLでjavascriptを使用してGETメソッドでPerlにreferrer情報を渡す方法もある。
HTMLに直接javascriptを記述する場合 HTMLの記述
<script type="text/javascript">
<!--
document.write("<img src='./cgi-bin/referrer.cgi?"+document.
referrer+"'>");
// -->
</script>
Perlの記述
$referer= $ENV{'QUERY_STRING'};

外部ファイル(referrer.js)に記述したjavascriptをHTMLで読み込む場合 HTMLの記述
<SCRIPT type="text/javascript" src="./referrer.js"></SCRIPT>
外部ファイル(referrer.js)の記述
document.write("<img src='./cgi-bin/referrer.cgi?"+document.
referrer+"'>");
Perlの記述
$referer= $ENV{'QUERY_STRING'};
※javascriptの場合ブラウザの設定やセキュリティソフト等により遮断される可能性が高い。

バージョンの取得

print "$]";

””のコード内に””を使用する

””の内側で”を使用する場合”の前に¥をつける
(例)print "<BODY bgcolor=\"#ffe4b5\">";

日本語の文字コードを変換(jcode.pl Jcode.pm Encode.pm)

★jcode.pl
Perl 4以降で使用でき、sjis、euc、jisの文字コード変換が可能ですがUnicode(UTF-8)には対応していません。 jcode.plはライブラリとしてPerlプログラムと同様にサーバーへアップロードして使用します。 Unicode(UTF8)に対応していないので使用するサーバーがPerl 4またはPerl 5.8.0以前でJcode.pmを組み込んでない場合以外は Jcode.pmまたはEncode.pmを使用された方がいいと思います。
jcode.pl require 'jcode.plのファイルパス';使用宣言
&jcode::convert($string,'sjis');$stringをShift_JISに変換
※perl4の場合
&jcode'convert(*string,'sjis');

★Jcode.pm
Perl 5以降で使用でき、sjis、euc、jis、Unicode(UTF-8)の文字コード変換が可能です。 Jcode.pmはモジュールとして通常、サーバー側に組み込まれていないと使用できませんが、 ver 2.0以降のJcode.pmはPerl 5.8.1以降だとEncode.pmのWrapperとして機能するようになり この場合、付属モジュールを必要としないため、jcode.plと同様、ライブラリとして使用可能。 その場合、使用宣言はuseではなくrequireになります。 またPerl 5.8.0以降だとEncode.pmが標準装備されているのでJcode.pmを使わずにそちらを使用することができます。
※jcode.plと違い、Jcode.pmは頭文字が大文字なので間違えないよう注意
Jcode.pm use Jcode;使用宣言
&Jcode::convert($string,'sjis');$stringをShift_JISに変換

★Encode.pm
Perl 5.8.0(2002年7月18日リリース)以降で標準装備。標準装備なので別途ライブラリを準備したり、 サーバーにモジュールを組み込んだりする必要もなく文字コードの変換ができる。 よほど古いperlを使用しているサーバーでない限りほぼ利用可能なのでEncode.pmの利用を推奨。
Encode.pm use Encode;使用宣言
Encode::from_to($string, "utf8", "shiftjis" );utf8の$stringをShift_JISに変換
上記の場合、変換元がutf8と分かってないと変換できないので自動判別するには以下のようにする
$to = "Shift_JIS";変換後の文字コード
use Encode;使用宣言
use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /;文字コード判別モジュール使用宣言
$enc = guess_encoding($value);文字コード判別
if( ref $enc ){
$from = $enc->name;文字コード取得
Encode::from_to($value, $from, $to);文字コード変換
} elsif ($enc eq "shiftjis or euc-jp"){文字コードがshiftjis or euc-jpだったらeuc-jpに変換
Encode::from_to($value,'euc-jp', $to);文字コード変換
} else {文字コードが不明な場合、UTF-8コードと見なす
Encode::from_to($value,'utf8', $to);文字コード変換
}

if(もし~ならば){真で実行}else(そうでないなら){偽で実行}; や
$page = 1 if(!$page); がよく使われる形式
  • もし$@にエラーメッセージがあるなら
    if($@)
  • もし$dataにデータがないなら
    if(!$data)
  • もし$dataと$betaが同じなら(文字列)
    if($data eq $beta)
  • もし$dataと$betaが同じなら(数値)
    if($data == $beta)
  • もし$betaがより$dataが大きいか同じなら(数値)
    if($data >= $beta)
  • もし$dataと$betaが同じまたは$dataと$sitaが同じなら(文字列)
    if($data eq $beta || $data eq $sita)
  • もし$dataと$betaが同じでさらに$dataと$sitaが同じなら(文字列)
    if($data eq $beta && $data eq $sita)
  • もし$dataに あいうえお が含まれているなら if($data =~ /あいうえお/)
$dataにカンマがある場合削除
$data=~ s/\,//;
$dataに&がある場合&ampに置き換え
$data=~ s/\&/&amp/g;
※通常マッチするとそこで置き換えて終わるが末尾にあるオプションg(修飾子)を付けることでマッチするものすべてを置き換える。 オプションiだと英字の大文字・小文字の区別なくマッチ対象となる。なお修飾子の併用も可。 @dataの先頭に$dataを追加
unshift(@data,$data);
@dataの末尾に$dataを追加
push(@data, $data);
配列の要素数の取得には2通りあり、配列をスカラーに代入する方法と 添字の最大値を取得して+1にする方法がある。
(例1)
@data = ("あ","い","う","え","お");
$data = @data;
(例2)
@data = ("あ","い","う","え","お");
$data = $#data + 1;
これで$dataに要素数5が格納される。要素数を取得するだけなら例1のほうが簡単だが $#dataには添字の最大値以下の数値を代入することで添字(要素数)を減らせることができる。 そのためデータ保存件数の調節などで使用できる。
(例)
@data = ("あ","い","う","え","お");
$#data = 2;
で、@dataには「あ」「い」「う」のみ格納される

パーミッション(アクセス権)を変更

変更したファイルの数 = chmod(パーミッション,"ファイル名");
(例)chmod(0666,"$file")||die print"chmod Error";

ファイルの所有者とグループを変更

変更に成功したファイルの数 = chown(ユーザーID , グループID , 対象のファイル);
(例)chown(100,100,"$file")||die print"chown Error";
※ユーザー名・グループ名は使用不可。

シングルクォーテーションとダブルクォーテーションの違い

シングルクォートの場合、クォートで囲まれた文字列すべてがそのまま文字列の内容になります。 ダブルクォートの場合、クォートで囲まれた文字列に$ @ &があれば変数として\があればメタ文字または次の文字をそのまま表示するという扱いになります。

正規表現

if (文字列(または変数) =~ /正規表現内容/){実行文}
のような形で使用。
正規表現を参照。

エラー処理

プログラムにエラーは付き物です。エラーが発生したときにどういったエラーなのかが分かれば制作者も使用者も対処しやすくなります。 プログラム作成中などで構文エラーも確認したいときは実行内容の前に以下を記述すればブラウザで表示されます。 use CGI::Carp qw(fatalsToBrowser); プログラム使用中でのエラーは以下のように記述。 実行内容 || エラー処理 または 実行内容 or エラー処理 open(FILE,"logs.txt") || die "File Open Error"; 上記ではdie関数でエラー時にFile Open Errorをサーバーログに出力しプログラムを終了します。 サーバーログにエラーが出力されても使用者にはわからないのでWebで表示するには以下のようにする。 print "Content-Type: text/html; charset=Shift_JIS\n\n"; open(FILE,"logs.txt") || die print "File Open Error"; またPerlではopen関数を含めエラーの出そうな関数には特殊変数$!にエラー内容を出力する機能もあります。 eval関数は例外で特殊変数$@にエラー内容が出力される。 print "Content-Type: text/html; charset=Shift_JIS\n\n"; open(FILE,"logs.txt") || die print $!; ※特殊変数$!にエラー内容を出力する関数
accept, bind, chdir, chmod, chown, chroot, close, closedir, connect, dbmclose, dbmopen, exec, fcntl, flock, getpeername, getpgrp, getpriority, getsockname, getsockopt, ioctl, kill, link, listen, lstat, mkdir, msgctl, msgget, msgrcv, msgsnd, open, opendir, pipe, print, printf, read, readdir, readline, readlink, readpipe, recv, rename, require, rewinddir, rmdir, seek, seekdir, select, semctl, semget, semop, send, setpgrp, setpriority, setsockopt, shmctl, shmget, shmread, shmwrite, shutdown, sin, socket, socketpair, stat, symlink, syscall, sysopen, sysread, sysseek, system, syswrite, truncate, unlink, use, utime, wait, waitpid, warn, write

特殊変数

$_ デフォルトの変数
@_ サブルーチンの引数
$! エラー番号またはエラーメッセージを保存
$/ 入力レコードのセパレータ
$" 配列を変数展開するときのセパレータ
$. ファイルハンドルから読み込んだ行数

フォーマット(表示形式)の変換

フォーマット(表示形式)の変換にはsprintf関数を使います。
$test = sprintf( "%.3f", 0.12345 );
$testには小数点第四位で四捨五入した小数点第三位までの数値が表示。

排他制御(ファイルロック)

排他制御の方法はいくつかあります。
* ファイルロック関数を使用する方法(flock式)
* シンボリックリンクを使用する方法(symlink式)
* ディレクトリを使用する方法(mkdir式)
* ファイルの存在やファイル名を使用する方法(rename式)

環境変数の利用

環境変数とは、サーバーの情報やアクセスしたブラウザーがサーバーに対して送信した情報を格納する変数で %ENVと言う連想配列に格納されており、キー(環境変数名)を指定することで特定の環境変数の値を取得できます。
$aaa = $ENV{'環境変数名'};
取得できる環境変数には以下のようなものがあります。
HTTP_USER_AGENT ブラウザ名
HTTP_REFERER アクセス元のURL
REMOTE_ADDR リモートホストのIPアドレス

文字化けする文字

Shift-JIS環境でよくある文字化け。例えば 表 は文字コードが955Cで \ の文字コードが5Cのため 95 と 5C が 別々の文字コードと認識されるために文字化けが起こる。それを回避するためにエスケープシーケンス \ を後ろに付加して 表\ とすることで 文字コード955Cの 表と認識される。そのほかにも以下のような文字が該当する。
― ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡

TOPへ
戻る