4.Perl マニュアル(基礎)


ここでは、Perlの基本的な文法や関数などについて勉強したいと思います。
あくまでも基本なので、もっと詳しく知りたい方は検索するか他のサイトもしくは書籍をご覧ください。


@基本的な型

CGIでの処理結果のほとんどは、「HTMLドキュメントとして返す」、「画像を返す」、「ファイルに記録する」のいずれかであると思います。
「画像を返す」代表的なものはGIF画像を返す「アクセスカウンタ」ではないでしょうか。
ほとんどのスクリプトは、ファイル操作を行いHTMLドキュメントを生成しています。
その生成されたHTMLドキュメントを私たちは見ているわけですね。
例えば次のような感じですね。-> 実行結果はここをクリック
これは、次のHTMLドキュメントを生成しています。-> 上の実行結果を「ソース」で見ても日本語が化けて見えるかも(EUCで保存してます)

A文法と特徴

(1) 「#」で始まる行(先頭行)以外はコメントであり、プログラム実行されません。行途中に「#」を書いた場合は、行のそれ以降がコメントになります。
(2) 実行文の最後には「;」を書きます。
(3) 変数は、いつでも、どこでも使用できます。変数宣言も要らないしエラーにもなりません。
(4) 変数には「数値」、「文字」のどちらでも代入できます。
(5) 処理ブロックは「 { 」と「 } 」で囲みます。
(6) 大文字、小文字を判別します。
んー、結構自由なんだね。その分自分で管理しないといけないね。

B基礎 ・・・・・・・ 本当に基礎の基礎です。

(1)エスケープシーケンス
これは、ESCコード(記号「 \ 」 エスケープキャラクタともいう)に続く文字を使って命令を送るシーケンスのことです。
プリンタや画面などに表示されない特別な命令を送る場合に使います。
エスケープシーケンス
表記 意味 機能
\n 改行と復帰 次の行の先頭に移動
\r リターン(復帰) 同じ行の先頭に戻る
\t タブ 次のタブ位置まで移動
\' シングルクォーテーション 「 ' 」を表示させる。(後述します)
\" ダブルクォーテーション 「 " 」を表示させる。(後述します)
「 ' 」や「 " 」は文字や文字列の範囲を表す特別な意味があり、そのままでは表示できないためです。
(2)引用符
「 " 」と「 ' 」の2つがあります。
「 " 」は可変定数で、引用符内で変数を使うことができます。
「 ' 」は固定定数で、引用符内で変数を使うことができません。
次の例の場合は同じように見えますが、結果は違います。
2行目の結果 → 心は 晴れ です。
3行目の結果 → 心は $kokoro です。
(3)変数
Perlでは変数の宣言が必要ありません。変数には次のようなものがあります。
変数名は、英数字または「_ 」で構成しないといけません。
変       数
変 数 内 容
スカラ変数 「 $ 」で始まる、値を1つ記憶できる変数、最も一般的に使用します。
配列変数 「 @ 」で始まる、複数の値を記憶できる変数
連想配列変数
またはハッシュ変数
「 % 」で始まる、配列変数の添字に文字列を指定できる変数
なぁーんて、分かる人はいいけど・・・・・・後で具体例で学習しましょうね。
(4)特殊な変数・・・・・・・・・これよく出てきます。とりあえずここでは「こんなんあるよ」くらいにしときます。
Perl には、特殊変数という特別な意味を持った変数が用意されています。表記が $| のように意味不明なため、プログラミング初心者でなくても使うのがためらわれるものですが、特殊変数を効果的に利用することでプログラミングが楽になります。(でも、非常に読みづらくなることも否めませんね)
変 数 内       容
$. 入力時のレコード区切り文字。通常は改行
$, 出力時の項目区切り文字。print @exp; の時に有効
$" 出力時の項目区切り文字。print "@exp"; の時に有効
$\ 出力時の行末文字。print "$exp"; の後ろに付加される
$# 出力時の数値形式。通常は"%.20g"。
$% 出力時の現在のページ番号
$= 出力時の現在のライン数
$- 出力時の残り行数
$~ 出力時のフォーマット名
$^ 出力時のヘッダフォーマット名
$| 0以外が代入されると出力をバッファリングしなくなる
$$ プロセスID
$? 最後に実行されたコマンドのステータス
$& パターンマッチにマッチした部分文字列
$` パターンマッチにマッチした部分の前側の文字列
$' パターンマッチにマッチした部分の後側の文字列
$+ パターンマッチの最後の()に対応する文字列
$0 perlスクリプトのコマンド名
$1 パターンマッチの際の1番目の()に対応する文字列
$[ 配列の最初の添え字
$] perlのバージョン情報
$; 高次元連想配列の添え字の区切り文字
$! エラー番号、もしくはエラー文字列
$@ 直前のevalコマンドのエラーメッセージ
$< このプロセスの実ユーザーID
$> このプロセスの実効ユーザーID
$( このプロセスの実グループID
$) このプロセスの実効グループID
$^D デバッグフラグの値
$^F システムファイルディスクリプタの最大値
$^I -iオプションで指定した拡張子の名前
$^P デバッガが使用する内部フラグ
$^T スクリプトを実行した時刻
$^W 警告スイッチの現在値
$^X perl自身の起動時の名前
@_ サブルーチンへの引数
@INC perlライブラリ検索ディレクトリ
%INC 読み込まれたライブラリファイルの配列
_LINE_ スクリプト中の現在の行数
_FILE_ スクリプトのファイル名
(5) 演算子
演算子は、文字列を連結したり、数値を計算したり比較したりするときに使います。
表記 内  容
+ 加算
- 減算
* 乗算
/ 除算
% 剰余算(割った余り)
** べき乗
++ インクリメント(1を加える)
-- デクリメント(1を引く)
.. 範囲演算子  (1..6)は(1,2,3,4,5,6)と同じ意味
. 文字列連結 例えば・・・ $answer .="data" と書くと 変数 $answerに文字列 data を追加する
&& and (論理積)
|| or (論理和)
それでは、もう少しくわしく見てみましょう。
a.比較演算子 ・・・・・ これの記述間違いで無限ループに陥ったり、誤った判定したりします。
表記 内容
 == (または) eq  等しい
 != (または) ne 等しくない
 < (または) lt 小さい
 > (または) gt 大きい
 <= (または) le 以下
 >= (または) ge 以上
 <=> (または) cmp  比較
上記の表において、記号演算子(Ex. ==, !=, <, >, <=, >=, <=>)は数値を比較する場合に、アルファベット(Ex, eq, ne, lt, gt, le, ge, cmp)は文字列を比較する場合に使用します。
確実に数値が代入されている変数を扱う場合は「記号演算子」を使う方が高速に処理されるとのことです。
b.代入演算子
変数に値を代入するには、「 = 」を使います。(等しいという意味ではありません)
「 = 」の右にある値または計算結果を左の変数に代入するという意味です。例えば・・・・

 $a = 3 ( 変数 a に 2 を格納します)
 $a = 3 * 4 ( 変数 a には 3 × 4 = 12 を格納します)
 $a = $b = 5 もしくは $a = ( $b = 5 ) (変数 a と b に同時に5を格納します)
 $a = 5 + ( $b = 5) (変数 b に 5 を格納し、変数 a には 変数 b に 5 を加算した値を格納します -> 変数 a の値は 10 です)
c.二項代入演算子
式の両側に同じ変数名が現れるようなものがよく使われます。この時、右側の変数名を省略して結果を代入する式をいいます。
意味 省略した式
 $a = $a + 1  変数a を +1 する  $a += 1
 $a = $a - 1 変数a を -1 する  $a -= 1
 $a = $a * 2 変数a の内容に2をかける  $a *= 2
 $a = $a / 2 変数a の内容を2で割る  $a /= 2
 $a = $a . "takaq"  変数a に 文字列 "takaq" を付加する  $a .= "takaq"
d.インクリメント、デクリメント
前記に加え、加算か減算される値が1の場合に限りさらに省略することができます。
ただし、使い方を間違えたり多用したりするとバグった時になかなか見つけることが困難になります。
意味 省略した式
 $a = $a + 1 変数a を +1 する(インクリメント) ++$a
$a++
 $a = $a - 1 変数a を -1 する(デクリメント) --$a
$a--
上の省略式の場合は「++(--)」をどちらに置いても同じ結果が得られますが、次のような場合は結果が違ってきます。
・ $a = ++$b  ( $a に +1して $b に代入する)
・ $a = $b++  ( $a を $b に代入して $a を+1する)
・ $a = --$b  ( $a に -1 して $b に代入する)
・ $a = $b--  ( $a を $b に代入して $a を+1する)

  うぉーーーーー、なんか解りづらい! これ嫌い!!!  ( ;゚д゚)
e.文字と数値の演算
Perlは、文字と数値を計算させても何のエラーも出さず計算します。
数値演算子である「+」を使って文字を計算すると次の例のような結果になります。この場合文字列は10進数の数値に自動的に変換されます。
(文字列は無視されたようになるわけですね)
$ans = "13.25" + "trable"      → $ans には 13.25 が代入されます。
$ans = "13.25" + "6.75trable"   → $ans には 20 が代入されます。
また、文字列連結演算子を使うと、次のようになります。
$str = "A" . (4 * 3)          → $str は A12 になります。
(6)正規表現
いくつかの文字列を一つの形式で表現するための表現方法のことをいいます。
たくさんの文章の中から検索したり、置換したりできます。
基本的なメタ文字を次にあげます。他にもたくさんのメタ文字がありますが、そちらは他のサイトでお調べください。
基本的なメタ文字
. 改行を除く任意の 1 文字  
* 直前のパターンが0回以上の繰り返し
+ 直前のパターンが1回以上の繰り返し {
? 直前のパターンが0回または1回現れる {
^ 文字列の先頭。m修飾子指定の時は行の先頭。  
$ 文字列の末尾。m修飾子指定の時は行の末尾。  
\ 右隣のメタ文字をクォートするエスケープ文字  
| パターンの選択  
() パターンのグループ化  
[] カッコ内の文字どれかひとつ 使えるメタ文字 \b \f \n \r \t \nnn \d \w \s - ^
[a-z] 範囲内の文字どれかひとつ。この場合アルファベットaからzの間  
特殊な文字や文字クラスにマッチするメタ文字
\d 数字0〜9 [0-9]
\w 英数字と_ [_a-zA-Z0-9] と同義
\s 空白文字(空白・タブ・改行) [ \t\n\r\f] と同義
\b 単語境界 (単語の区切り)  
\B 単語境界以外  
(7)検索・置換
検索や置換の基本的な書式を以下に記載します。
a.検索 → 文字列の調査
書式1・・・・・・・・・・ STRINGS = ~/PATTERN/
文字列(STRINGS) が PATTERN に一致するかどうかを検査します。
例えば
if ("ABCDEFGHI" = ~ /"ABCDE"/) {
  print "一致しました!;
}
else{
  print "一致していません";
}
結果は、"一致しました!"と表示します。
書式2・・・・・・・・・・・ STRINGS = ~/[PATTERN]/
[ ] (ブラケットという)に並べた文字とどれか一つでも一致すれば「真」です。
b.置換 → 文字列の置き換え
変数の中で、PATTERNに一致する部分を REPLACEMENT で置き換え、結果を変数に格納します。
書式
T. 変数 = ~s/PATTERN/REPLACEMENT/  ・・・ 最初に一致した部分のみ置換
U. 変数 = ~s/PATTERN/REPLACEMENT/g  ・・・ 変数のPATTERNすべてを置換
V. 変数 = ~s/PATTERN/REPLACEMENT/ig ・・・ 大文字、小文字を区別しないで変数のPATTERNすべてを置換
例えば
$str = "takeaqe";
$str = ~s/'e'//;
print $str;              → 結果は takaqe と表示します。
また、
$str = "takeaqe";
$str = ~s/'e'//g;
print $str;              → 結果は takaq と表示します。
置換は、BBSなどでタグやSSIを禁止したりスクリプトの禁止などに使ったりします。
(8)文字列操作関数
文字列の長さを調べたり、指定の文字列を取り出したりする関数です。
a. chop
[末尾削除した文字列] = chop (STRING)
文字列STRINGの最後の文字を落としてその切り落とした後の文字列を返す。入力文字列から最後の改行文字を除くのに使ったりします。
引数が省略されると、$_ を対象として chop します。
b.length
[文字列の長さ] = length (STRING)
文字列STRINGの長さをバイト数(文字数ではありません)を返す。全角・半角混在でもキチンとバイト数を返します。
c.substr
[取り出した文字列] = substr (STRING, OFFSET, LENGTH)
文字列 STRINGOFFSET バイト目から LENGTH バイト取り出した文字列を返す。
1 文字目は OFFSET 0 です。
OFFSET が負の場合は、文字列の終わりからその数分戻った所から始める。
LENGTH を省略すると、文字列の残り全部を返す。
d.index
[結果(検索文字列 が見つかった位置)] = index( STRING , SUBSTR, OFFSET)
文字列 STRING の中で、指定文字列 SUBSTR が最初に現れる位置(バイト位置)を返す。
先頭の文字を0番目とする。OFFSET を指定すると、その位置から探索を開始する。

返却値のベースは、0 もしくは、変数 $[ に設定した値である。検索文字列 が見つからなかった場合には、ベースよりも 1 小さい値、通常は -1 が返る。

戻る

サイトトップへ