perl5
P ractical
E xtraction and
R eport
L anguage
Pathologically Eclectic Rubbish Liste
(病的折衷主義ガラクタ出力機)

についてのKAINの個人的研究用NOTE
(結構ぐちゃぐちゃ)Shift_JIS版

CONTENTS 暇なとき制作中
Perl のデータ構造
  [変数名][コンテキスト][スカラ値][スカラ値の構成][リスト値の構成]
Perl の構文
  [DESCRIPTION][単純実行文][複合実行文]
Perl の演算子と優先順位
  [演算子と優先順位インデックスへ]
Perl の正規表現
  [DESCRIPTION][正規表現][Version 8 正規表現][FAQやTIPS]
Perlrun Perlのインタプリタでの実行とオプション
  [DESCRIPTION][スイッチ]
perlfunc Perl の組み込み関数
(GZIP圧縮済みHTMLにてIE4 or NN4以上でないと見れません)
  [DESCRIPTION|リストをスカラに変換|ファイルテスト]
  [A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|W|Y]

perlfunc Perl の組み込み関数通常版
  [DESCRIPTION|リストをスカラに変換|ファイルテスト]
  [A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|W|Y]

プログラムの実行時に何か変なことが起こって、
どこを参照したらよいかわからない場合には、
取り敢えず-w スイッチを試してみる。
これで、問題か所を特定できる場合も多々あり。
-wはスクリプトの一行目の#!の行に書く事もできます。

MEMO
  1. KAIN の 覚え書きとか
  2. KAIN のカンベ(笑)
  3. PTKで何となくGUIで遊ぶ時の参考
  4. サーバーからのステータスコード(Status-Code)
  5. KAINのCGIの素 モジュール CgiMaker
    作りかけ(笑)どこでも続きを作れるようにおいてるだけ(笑)
  6. Perl/CGI掲示板
−−近頃悩んだこと−−
漢字コードがSJISの場合、 SJIS の第2バイトは 0x40〜0x7e、0x80〜0xfc ですから、
ASCII と次の
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 
が重なります。
# 0x21〜0x3f の !"#$%&'()*+,-./0123456789:;<=>? 
は重複していません。
この重複領域の文字がワルサをすることがあります。
例えば、第2バイト に "@" などが含まれていて "" 内などの文字列として使われていた場合、 perl はこれを配列として展開しようとします。
JIS(ISO-2022-JP)ではもっと困る問題があります。
JIS で「JISです」という文字列は上記ISO-2022-JPで述べたように
ESC$B#J#I#S$G$9ESC(B
となり、指示子を含んだものとなります。
#ESCはよく^[で表されるエスケープ文字です。
これに対して「JIS」と言う文字でマッチングしようすると
ESC$B#J#I#SESC(B
となり、マッチングしません。
したがって、一度 重複する部分がないEUCにjcode.pl等で変換してから 処理するのが良策ということになります。
また、Jperlにもあるように、2バイト文字は以下のような正規表現等々 いろんなコマンドに影響を及ぼします。
tr/// y/// format chop split substr index rindex -B,-T演算子 reverse 等々

Perl の概論

DESCRIPTION
Perl は、テキストファイルを読み取り、そこから情報を引き出し、その情報を元に様々な報告を行なうように設計された、インタプリタ言語です。
また、多くのシステムマネジメントの作業を行なうのに適した言語でもあります。
この言語は、綺麗さ (小規模、エレガント、最少) ではなく、実用性 (使い易さ、効率、完全性) を目指しています。
この言語は、(少なくとも作者の意見では) C,sed, sh の良い部分を組み合わせているので、これらの言語に馴染みのある方には、それほど難しいものではないでしょう。(言語歴史学者はまた、csh, Pascal あるいは BASIC-PLUS の痕跡にも気付くかもしれません。)
式の構文はかなりの部分で、C の式の構文に対応したものとなっています。
多くの UNIX のユーティリティとは違って、Perl はデータの大きさに恣意的な制限を設けません。つまりPrel では、メモリさえ十分にあれば、ファイルを丸ごと 1 つの文字列に入れてしまうこともできます。再帰の深さにも制限がありません。また、連想配列が使用するハッシュテーブルは、パフォーマンスを損なわないように、必要に応じて、自動的に大きくなります。Perlでは、大量のデータをすばやく走査できるように、工夫を凝らしたパターンマッチの技術を使っています。
テキストの走査のために設計されてはいますが、Perl では、バイナリデータを扱うこともできますし、(dbm が使えるところでは) dbm ファイルを連想配列のようにして扱うこともできるようになっています。
データフロートレース機構を使って、単純ミスによるセキュリティホールを塞ぐようにしているため、多くの場合、setuid Perl スクリプトは C のプログラムよりも安全です。
普通は sed や awk やsh で書くような問題でも、少し荷が重すぎるようなとき、多少でも実行速度を速くしなければならないときや、Cで書く程でもないときには、Perl が最適でしょう。
また、sedや awk のスクリプトをPerl のスクリプトに変換するトランスレータも用意されています。

Perl version 5 は、ほとんど全て書き直されており、 以下のようなことが追加されています:

多くの利便性に関する拡張
より読みやすい Perl コードが書けるようになりました
(たとえ正規表現の中でも)。
以前の暗号的な変数名は覚えやすい識別子で置き換えることができます。
エラーメッセージの情報量が多くなり、オプションの警告によって、初心者が犯すような過ちを見つけやすくなっています。
これは、あまり強要してはいません。
何かおかしな動作を見つけたら、-w スイッチを使ってみてください !!!
変な動作が見つからない場合にも -w スイッチを使ってください。
単純化された文法
新しい yacc 文法は以前に比べて、半分の大きさになりました。 任意文法規則の多くが正規化されました。
予約語の数は 2/3 ほどに切り詰めています。
それにもかかわらず、ほとんどすべての古い Perl のスクリプトを変更なしに使うことができます。
文面に従ったスコープ
Perl の変数を、C の "auto" 変数のように、字句スコープで宣言することができます。
 これは効率的であるばかりでなく、「大規模プログラミング」におけるプライバシーの保護にも役立ちます。
任意の多重データ構造
任意のスカラ変数 (配列の要素でもよい) が、他の変数やサブルーティンへのリファレンスを持つことができます。
名前のない変数やサブルーティンを作ることが簡単にできます。
また、Perl がリファレンスの参照数を管理してくれます。
モジュール性と再利用性
Perl ライブラリは、様々なパッケージで簡単に共有できるモジュールという形で定義されるようになりました。
パッケージは、モジュールが公開しているインタフェースのすべて、あるいは一部をインポートすることを選択できます。
プラグマ (コンパイラディレクティブのこと) は同じ機構によって定義され、使用されます。
オブジェクト指向プログラミング
パッケージはクラスとして機能します。
少しばかり新しい文法を導入して、動的多重継承や仮想メソッドを、明快な方法でサポートしています。
ファイルハンドルをオブジェクトとして扱うことができるようになりました。
組み込み容易性と拡張性
Perl は簡単に C や C++ のアプリケーションに組み込めるようになり、文書化されているインタフェースを使って、それらのルーティンとの間で、相互に呼び出しを行なったりすることができます。
プリプロセッサ XS は、C や C++ のルーティンを Perl に張り付けるのを手伝ってくれます。
動的なモジュールのロードがサポートされています。
POSIX 親和性
主な新規モジュールとして POSIX モジュールがあり、適切なところでオブジェクトクラスを介するようにして、利用可能な POSIX のルーティンや定義をアクセスすることができます。
パッケージコンストラクタとデストラクタ
新しい BEGIN と END ブロックは、パッケージがコンパイルされるときと、プログラムが終了した後に制御を受け取るために使われます。
縮退した形として、-p や -n スイッチを用いたときには awk の BEGIN と END のように動作します。
複数の同時 DBM インプリメンテーション
一つのスクリプトから、Perl プログラムが DBM、NDBM、SDBM、GDBM、バークレイ DB のファイルを、同時にアクセスできるようになりました。
実際には、旧 dbmopen インタフェースは、任意の変数をアクセスメソッドを定義しているオブジェクトクラスに tie する形式に一般化されました。
サブルーティン定義の自動ロード
実際には、AUTOLOAD 機構では、未定義のサブルーティンコールのために、任意の内容を定義することができるようにしています。
自動ロードのためだけではありません。
正規表現の拡張
最長一致ではない数量子を指定することができます。
後方参照とならないグループ化が可能になりました。
正規表現の中に空白やコメントを書くことができ、読みやすさが向上します。
すべての古い正規表現にアッパーコンパチな一貫した拡張性機構が組み込まれました。

ENVIRONMENT
HOME chdir が引数なしで使われたときに参照されます。
LOGDIR chdir が引数なしで使われたときに、HOME が設定されていないと参照されます。
PATH サブプロセスを実行するときと、-S を使ったときにスクリプトを探すために参照されます。
PERL5LIB Perl のライブラリファイルを探すときに、標準のライブラリディレクトリとカレントディレクトリよりも前に探しにいくディレクトリを、コンマで区切って並べたリストです。
PERL5LIB が定義されていないときには、PERLLIB が使われます。
PERL5DB デバッグのコードを持ってくるためのコマンドを指定します。
設定されていないときには
    BEGIN { require 'perl5db.pl' }
がデフォルトとして使用されます。
PERLLIB Perl のライブラリファイルを探すときに、標準のライブラリディレクトリとカレントディレクトリよりも前に探しにいくディレクトリを、コンマで区切って並べたリストです。
PERL5LIB が定義されているときには、PERLLIB は使われません。
これら以外は、実行されるスクリプトとチャイルドプロセスから環境変数が使えるようにするのを除いて Perl は環境変数を使用しません。
しかし、setuid で実行するスクリプトは何よりもまず以下を行なうようにしてください:
    $ENV{'PATH'} = '/bin:/usr/bin'; # 必要なものを
    $ENV{'SHELL'} = '/bin/sh' if defined $ENV{'SHELL'};
    $ENV{'IFS'} = '' if defined $ENV{'IFS'};

ファイル
"/tmp/perl-e$$" -e commands によるテンポラリファイル

"@INC" perl 5 ライブラリの位置

SEE ALSO
a2p awk から perl へのトランスレータ
s2p sed から perl へのトランスレータ
DIAGNOSTICS
-w スイッチは、幾分わかりやすい診断メッセージを出します。
すべての Perl の診断メッセージについては、perldiag manpageを参照してください。
コンパイル時のエラーでは、エラーの起こった行番号に、次に調べられるはずだったトークンかトークンの型を示します。
(スクリプトが -e スイッチで Perl に渡される場合には、-e スイッチ 1つが 1 行とカウントされます。)
setuid スクリプトでは、制限事項が増えるため、"Insecure depen-dency" といったエラーメッセージが表示されることがあります。
perlsec manpage を参照してください。

絶対に -w スイッチを使った方が良いっていうのは、もう書きましたっけ ?
BUGS
-w スイッチが必須になっていません。
Perl は型のキャストや atof() や sprintf() のような様々な操作のマシンごとの定義に依存します。
使用している標準入出力ライブラリが、read と write の間にseek や eof が必要なものであれば、Perl でも同様となります。
(ただし、sysread() や syswrite() には適用されません。)
組み込みのデータ型には (メモリサイズからくるものを除いて) 恣意的なサイズの制限はありませんが、それでもいくつかの恣意的制限は存在します: どの識別子も 255 文字より長くてはなりませんし、-S を使った時、どの PATH も 255 文字より長くてはいけません。
正規表現は、内部的にコンパイルされた時、32767 バイトを越えることができません。

Larry Wall 「Perl は本当は「病的折衷主義ガラクタ出力機」(Pathologically Eclectic Rubbish Lister) を意味していますが、私がそういった事をばらしてはいけません」(笑)
NOTES
Perl的哲学 「やり方は 1 通りではない」
プログラマの 3 つの美徳は、無精、短気、傲慢です。
理由は、キャメルブックを参照してください。

PERLの開発者は
Larry Wall lwall@netlabs.comです。

出典:Perl manpages Last change: Release 5.0 Patchlevel 00 5