PaddieのCGIの部屋        Since 2000.04.28

ここではPaddieが作ったCGIスクリプトの紹介やCGI (Webサーバーの設定やPerl) について、わかる範囲で(笑)解説します。
〜Last Modified : 24 May.2000〜


 
Perlリファレンス

 ここで解説しているのは、「Perlてどう書くの?」のシリーズで登場したものだけです。

close関数
exit関数
foreachステートメント
last関数
localtime関数
open関数
ifステートメント
print関数
printf関数
require関数
sprintf関数
s///(置換演算子)
time関数
unlessステートメント
untilステートメント
whileステートメント
#!ディレクティブ
``(逆クオート)
=~(パターンマッチング演算子)
アングル演算子
ヒアドキュメント
ステートメントブロック
 
close関数の構文 説明
 close (Filehandle);

 実際の使用例:
 close (IN);
 close (LOG);
Filenameに指定したファイルハンドルに関連づけられたファイルを閉じます。

Perlでは通常、以前に開いたファイルハンドルを閉じずに再度開くと、自動的に以前の物は閉じられることになっていますので、その場合はcloseを省略できます。

また、スクリプト自体の終了時には開いているファイルが全て閉じられるので、あまり複雑でないものはcloseを省略することもできます。

しかし、普通はclose関数を使ってきちんと閉じておくのがいいでしょう。

このページのトップに戻る
 
exit関数の構文 説明
 exit (Expr);

 実際の使用例:
 exit;
 exit (0);
与えられた式Exprを評価し、その値を使用してPerlスクリプトを終了します。

式が省略されたときは0が使用されたのと同じです。

このページのトップに戻る
 
foreachステートメント 説明
 foreach スカラー変数 (配列またはリスト){
 Statement 1;
 Statement 2;
 ・
 ・
 }

 実際の使用例:
 foreach $line (@lines)
  {
  print $line;
  }
与えられた配列またはリストの先頭の要素から順にスカラー変数に代入し、ステートメントブロック内の処理を繰り返す。
全ての要素が代入され終わったらループ終了となる。

このページのトップに戻る
 
last関数 説明
 last (ラベル);
 実際の使用例:
 foreach $line (@lines)
  {
  if ($line =~ /^p/)
   {last;}
  print $line;
  }
引数で与えられたラベルで表されるループから抜ける。引数が与えられない時は、その「last」が記述されているもっとも内側のループから抜ける。

左の例では、「p」で始まる行があればそこで表示が終了する。

このページのトップに戻る
 
localtime関数の構文 説明
 localtime (Expr);

 実際の使用例:
 @date = localtime (time + 3600);
 localtime (95654214);
与えられた式Exprを評価し、その値を1970年1月1日00:00:00からの秒数として得られる時刻を9つの要素のリストを返します。

Exprに「time」を指定すると、現在の時刻の9要素のリストが得られます。

その9つの要素は順に、「秒」「分」「時」「日」「月」「年」「曜日」「元日から何日目か」「夏時間の設定」です。

通常使用するのは「秒」「分」「時」「日」「月」「年」「曜日」ですが、「月」は1月が0、12月が11、「曜日」は日曜日が0、土曜日が7で表されますので、使用する際には注意が必要です。

このページのトップに戻る
 
open関数の構文 説明
 open (Filehandle, Expr);

 実際の使用例:
 open (IN,"./read.txt");
 open (LOG,">>../output.log");
Expr引数に指定したファイルを開きFilenameに指定したファイルハンドルに関連づけます。
Exprに何も付けずに(または「<」を付けて)ファイルを指定すると、そのファイルが読み込み用であることを示します。

「>」を付けると上書き用を指定でき、もし、そのファイルが存在しない場合は作成されます。

「>>」を付けると追記用として指定されます。

「+>」「+<」のどちらかを付けると読み込み、書き込みの両方が行えます。

open関数で開いたファイルはclose関数で閉じておきます。

このページのトップに戻る
 
ifステートメント 説明
 if (expr) {
 Statement 1;
 Statement 2;
 ・
 ・
 } elsif (expr2) {
 Statement 3;
 Statement 4;
 ・
 ・
 } else {
 Statement 5;
 Statement 6;
 ・
 ・
 }

 実際の使用例:
 $test = 17;
 if ($test < 20) {
  print $test;
 }
条件式(expr)が真(True)、つまり、式が成り立つ時、後に続くステートメントブロックが実行されます。

条件式(expr)が偽(False)の時は次のelsifの条件式(expr2)が評価され、それが真(True)なら、その後に続くステートメントブロックが実行されます。

elsifはいくつ続いてもかまいませんし、省略してもかまいません。

そして、ifおよび全てのelsifの条件式が偽(False)となったとき、elseに続くステートメントブロックが実行されます。

elseは複数記述することはできませんが、省略は可能です。

よく似た構造のものにunlessステートメントがあり、こちらは条件式が偽(False)の時、後に続くステートメントブロックが実行されます。

しかし、unlessにはifのelsifに相当するものはありません。

左の使用例では「真」になるので$testが標準出力に表示されます。

このページのトップに戻る
 
print関数の構文 説明
 print Filehandle List;
 print List;

 実際の使用例:
 print OUT "出力しています\n";
 print "This is OUTPUT";
Listに指定される文字列(単独、またはカンマ区切りのリスト)をFilehandleに出力します。

Filehandleが省略された場合は、デフォルトではSTDOUT(標準出力)に出力します。

Listが与えられない場合は特殊変数「$_」が出力されます。

このページのトップに戻る
 
printf関数の構文 説明
 printf (書式, 引数);

 実際の使用例:
 printf ("%5d番目は%sさんでした\n", $num, $name);
書式に与えられた文字列中のフォーマット制御文字列(%+数字+アルファベット)の部分に、引数で与えられる変数の値を制御文字列の指定に従って整形し、それを順に埋め込んだものをSTDOUT(標準出力)に出力します。

制御文字列の種類は次の通りです。
%d 10進数整数
%f 10進数浮動小数点数
%c 文字
%s 文字列
%o 符号なし8進数
%x 符号なし16進数

整形方法は、
%6d 右詰め、6文字幅の10進数整数
%-6d 左詰め、6文字幅の10進数整数
%8.2f 右詰め、8文字幅、小数点以下2桁
%.6d 右詰め、6文字幅の10進数整数、桁が余る場合は先頭から0で埋める

構文はsprintf関数と同じです。

このページのトップに戻る
 
require関数の構文 説明
 require Expr;

 実際の使用例:
 require "jcode.pl";
式Exprに与えられるたものを評価し、その結果に対する依存を確認します。

ライブラリのファイル名が与えられた場合には、そのライブラリをインクルードします。

このページのトップに戻る
 
sprintf関数の構文 説明
 sprintf (書式, 引数);

 実際の使用例:
 $num = 27;
 $name = Jack;
 sprintf ("%5d番目は%sさんでした\n", $num, $name);
書式に与えられた文字列中のフォーマット制御文字列(%+数字+アルファベット)の部分に、引数で与えられる変数の値を制御文字列の指定に従って整形し、それを順に埋め込みます。

制御文字列の種類は次の通りです。
%d 10進数整数
%f 10進数浮動小数点数
%c 文字
%s 文字列
%o 符号なし8進数
%x 符号なし16進数

整形方法は、
%6d 右詰め、6文字幅の10進数整数
%-6d 左詰め、6文字幅の10進数整数
%8.2f 右詰め、8文字幅、小数点以下2桁
%.6d 右詰め、6文字幅の10進数整数、桁が余る場合は先頭から0で埋める
構文はprintf関数と同じです。

このページのトップに戻る
 
s///(置換演算子) 説明
 s/パターン/置換文字列/オプション

 実際の使用例:
 $text = "これはおいしい"
 $text =~ s/おいしい/まずい/;
与えられた文字列内でパターンにマッチする文字列があったとき、それを置換文字列に置き換える。

以下のオプションを設定できる。

e :置換文字列を式として評価する。
g :マッチするもの全てを置換する。
i :大文字、小文字を区別しない。
m :改行文字を無視する。
o :最適化し、パターンを一度だけコンパイルする。
s :文字列を1行として扱う。
x :拡張正規表現。

このページのトップに戻る
 
time関数の構文 説明
 time

 実際の使用例:
 @now = localtime (time);
 @tommorow = localtime (time + 86400);
引数はとらず、1970年1月1日00:00:00から現在までの経過秒数を返します。

左の下の例ではlocaltime関数に現在から丁度一日後(86400秒)の値を渡して一日後の時刻の9要素を得ています。

この方法はクッキーの有効期限などを設定する際に便利です。

このページのトップに戻る
 
unlessステートメント 説明
 unless (expr) {
 Statement 1;
 Statement 2;
 ・
 ・
 } else {
 Statement 3;
 Statement 4;
 ・
 ・
 }

 実際の使用例:
 $test = 17;
 unless ($test > 20) {
  print $test;
 }
条件式(expr)が偽(False)、つまり、式が成り立たない時、後に続くステートメントブロックが実行されます。

条件式(expr)が真(True)の時はelseの後に続くステートメントブロックが実行されます。

よく似た構造のものにifステートメントがあり、こちらは条件式が真(True)の時、後に続くステートメントブロックが実行されます。

左の使用例では「偽」になるので$testが標準出力に表示されます。

このページのトップに戻る
 
untilステートメント 説明
 until (expr) {
 Statement 1;
 Statement 2;
 ・
 ・
 }

 実際の使用例:
 $test = 0;
 until ($test > 20) {
  print "$test ";
  $test++;
 }
条件式(expr)が偽(False)、つまり、式が成り立たない間、後に続くステートメントブロックを繰り返し実行(ループ)します。

よく似た構造のものにwhileステートメントがあり、こちらは条件式が真(True)の間、後に続くステートメントブロックが繰り返されます。

左の使用例は0〜20までの数字を順に表示するループです。

このページのトップに戻る
 
whileステートメント 説明
 while (expr) {
 Statement 1;
 Statement 2;
 ・
 ・
 }

 実際の使用例:
 $test = 0;
 while ($test <= 20) {
  print "$test ";
  $test++;
 }
条件式(expr)が真(True)、つまり、式が成り立つ間、後に続くステートメントブロックを繰り返し実行(ループ)します。

よく似た構造のものにuntilステートメントがあり、こちらは条件式が偽(False)の間、後に続くステートメントブロックが繰り返されます。

左の使用例は0〜20までの数字を順に表示するループです。

このページのトップに戻る
 
#!ディレクティブ 説明
 #!/usr/bin/perl Perlスクリプトの一行目にはたいていこういう物があります。#!は「Shebang(しゃばん)」と読みます。

Perlインタプリタのパスを記述しますが、Perl for Win32などでは不要な場合もあります。

通常のUNIX互換システムの場合はPerlインタプリタはたいてい「/usr/bin」か「/usr/local/bin」に置かれることが多いようです。

このページのトップに戻る
 
``(逆クオート) 説明
 `Command`

 実際の使用例:
 $date = `date`;
 `ls -l`;;
文字列Commandを逆クオートで囲むと、OSにコマンドとしてその文字列を送り、その終了を待って結果を文字列として取り込みます。

左の例の上のものはdateコマンドの結果をスカラ変数$dateに代入、下のものは特殊変数$_にディレクトリのリストを代入します。

このページのトップに戻る
 
=~(パターンマッチング演算子) 説明


 実際の使用例:
 if ($test =~ /test/)
   {print "OK!";}
左辺に指定された文字列に対して、右辺に指定された文字列を用いてパターンマッチを行い、成功したら「真」を、失敗したら「偽」を返す。

左の例では$testというスカラー変数内に文字列「test」が含まれていれば「OK!」と表示する。

このページのトップに戻る
 
アングル演算子 説明
 <Filehandle>

 実際の使用例:
 $data = <IN>;
 <IN>;
アングル演算子は与えられたファイルハンドルに関連づけられたファイルから一行読み出すという動作をします。

複数回使用すると、前回読み込んだ次の一行を読み込みます。

標準入力からの読み込みを指定するには<STDIN>としますが、CGIではあまり使用しません。

左の使用例のうち、上の物は変数$dataに代入されているのが一目瞭然ですが、下の物はアングル演算子が単独で現れています。
このような場合には、読み込んだデータは特殊変数「$_」に代入されます。

このページのトップに戻る
 
ヒアドキュメント 説明


 実際の使用例:
 print <<HERE;
 一行目
 二行目
 ・
 ・
 HERE
<<の直後に任意の文字列(左の例では「HERE」)を指定すると、次の行からその文字列(終端文字列)が現れる直前の行までを一連の文字列とみなす。

CGIではHTMLの出力などのため、print関数と共に用いられることが多い。

このページのトップに戻る
 
ステートメントブロック 説明
 {
 Statement 1;
 Statement 2;
 ・
 ・
 }
一組の中カッコ(「{」と「}」)で囲まれた一つまたは複数のステートメント(命令文)からなるブロックで、単独で用いると一回だけ使用されるループ構造と同じです。

中カッコで囲まれていないものとの違いは「next」「last」「redo」演算子が含まれると処理の流れが変わるということです(後述)

また、「{}」とすると、「何もしないステートメントブロック」を作ることができます。
一見無意味のように見えますが、分岐構造で何も処理をさせたくない場合などに使用されます。

このページのトップに戻る
 


Copyright 1999-2000 Paddie
私宛のメールは"paddie@paddie.com"まで。

// TOPページ  // 掲示板  // MEMOちゃ  // CGIの部屋 //