Perl

1987年Larry Wallによって生み出された、文字列処理に特化しつづける優れたプログラミング言語Perl(Practical Extraction and Report Language)について

2006年11月22日

Googleサイトマップ自動作成ツールの検証

Googleサイトマップ自動作成ツールというのを見つけたので検証してみた。

ローカルのファイル一覧を取得してサイトマップ用の一覧を生成するプログラム。URLが一覧表示されるだけでサイトマップ形式になっていればまだ使えるかもしれない。ローカルのファイル一覧から取得する関係上、動的なページが多いサイトにおいては効果を発揮しない可能性が高い。

2006年10月20日

CGI, mod_perl, FastCGIの違いについて・・

CGI(Common Gateway Interface)とPerlをWeb上で高速化するための手法について比較してみました。

CGI
Webサーバー(apacheに依存しない)がCGIを介してプログラム(perlに依存しない)を実行する。

mod_perl
ApacheにPerlの実行エンジンを組み入れてperlプログラムを実行する。

FastCGI
Webサーバー(apacheに依存しない)がFastCGIとSocket通信をしてプログラム(perlに依存しない)を実行する。FastCGIがサービス待ち受けしている点が、CGIと違う。

参考サイト:

CGIスクリプトは何で書く?FastCGIで10倍高速化
lighttpd + FastCGI は mod_perl + Apache1.3 より1割ほど高速

2006年10月19日

Class::DBI::Replication

DBのレプリケーションをアプリケーション側で実施するperlのCPANモジュール。

DBの内容をマスターからスレーブに転送したりする機能は存在しないようだ。

はてなで使っているレプリケート機構に含まれているらしい。DBIなので、データベース依存しないところが評価できる。

ダウンロード

2006年10月 9日

正規表現におけるmオプションとsオプション

少しわかりにくい複数行マッチオプション(m)と単一行マッチオプション(s)について。Oreillyの「正規表現」の本では改良版行アンカーマッチモードとドット全文字マッチモードとあらわしている。Landscape - エンジニアのメモに具体例が載っているのでぜひ参考にしていただきたい。

2006年9月26日

TIMTOWTDI

perlの良い点でもあり、悪い点でもあるところを表現した言葉に「There is more than one way to do it.」というのがあります。

これは、「正解は一つではない」「もっと別のやり方もある」「他にもやりかたはあります」「一つの方法だけじゃない」を示していて、飽くなき探究心を持ったPerlプログラマーへの訓示でもあるようです。

2006年9月20日

jcode.plとjcode.pm

Perlにおける日本語処理の権威はjcode.pl作者の歌代和正さんとperlの日本語化版を作成された渡辺博文さんだろうと思う。Perl.5.8がリリースされるまでの間、マルチバイト処理をする上で、両氏のライブラリが有益だったことは言うまでもない。

一方jcode.pmを開発するDan Kogaiさんについては良く知らなかった。ちょうど、職場でjcode.plとjcode.pmについての話題があったので調べてみた。

jcode.plとjcode.pmの違いについてDon Kogaiさんが説明したページは、残念ながらもう存在しないが、Googleはキャッシュという形で残してくれている

2006年9月19日

正規表現

多くのプログラミング言語でも正規表現は実装されているが、実はかなり奥深い。そして、普通の人が聞いたら間違いなく「性器表現」と勘違いする不思議な言葉だ。現在、Oreillyから出版されている『詳細 正規表現 第2版』を読んでいて改めて正規表現について認識する必要があると考え、以下のとおりまとめてみた。これは今後順次改訂していく予定です。

正規表現の種類
正規表現にはPerlやPHP, Java, .NET, Python, Ruby, sedに実装されているNFAとawk, egrep, MySQLで実装されているDFAというものがある。NFAは従来からある正規表現であり、記述方法で動作速度が決まる。つまり、どれだけでも遅い正規表現を書くことが出来る(ひどい場合ではSegumentation Faultとなり、実行できない)と言うことになる。NFAで正規表現を記述するにはそれなりの知識と経験が必要になる。
一方で、DFAは最適化される正規表現であり、効率の悪い正規表現も実行動作前(コンパイル時)に最適化されて実行することになる。


文字クラス
リテラルをグループ化して、いずれか1つをあらわす。

[a-z] 小文字のアルファベットすべて
[^a-z] 小文字のアルファベット以外(「^」を最初におくと文字クラスが否定される)
[0-9] 数字すべて
[a-zA-Z] 大文字小文字を含むアルファベット
[a-zA-Z&[^mM]] 大文字小文字を含むアルファベット。但しMおよびmは除外される。


グループ
複数のパターンを表す。

(a|bc) aまたはbc
(?!a|bc) aでもbcでもない(否定形)


量子指定子
前に付くリテラルならびに文字クラス、グループを修飾する。

* 0文字以上
+ 1文字以上
? 0または1文字
{2,5} 2文字以上5文字以下
{,5} {0,5}の省略
{3,} 3文字以上


NFA拡張(Perl拡張)
NFA拡張にはキャプチャなし括弧(?: ...)、先読み(?= ...)、戻り読み(?<= ...)がサポートされている。
(?:aaa|bbb) aaaまたはbbb。但し(aaa|bbb)と異なり、括弧の中は$1で取得できないようにする(つまりメモリを節約することができる)。

(?<=aaa)bbb 直前にaaaがくるbbbにマッチ(先読み)。
(?<!aaa)bbb 直前にaaaがこないbbbにマッチ(否定先読み)。
aaa(?=bbb) 直後にbbbがくるaaaにマッチ(戻り読み)。
aaa(?!bbb) 直後にbbbがこないaaaにマッチ(否定戻り読み)。


・モード修飾子
多くの言語の場合には、大文字小文字の区別なしや改行を無視するiやxのモードを言語側で用意している。たとえば、Perlでは
$a =~ /a-z/i; #大文字小文字のアルファベットにマッチ
$a =~ /abc
def/x; #abcdefにマッチ(正規表現内の改行とタブを無効化する)
だが、正規表現内でもこれが利用できる。
(?i:[a-z])、(?:x:abc
def)で代用できる。iモード修飾子の場合には、正規表現内で大文字小文字を区別しないケースとするケースを混在させられる便利な修飾子といえる。


・欲張り型と非欲張り型
NFAにはバックトラックと言う機構によってパターンマッチングを行っている。バックトラックを抑止する方法が欲張り型であり、後続のマッチ文字列に配慮することなくマッチングする。逆に量子指定子の働きを最大限抑制する方法が非欲張り型である。いずれもNFAでサポートされている。
.++または(?>.+) 任意の文字列を欲張り型でマッチ(この場合はほとんど全ての文字列にマッチすることになり、後続するマッチ文字列の指定があれば失敗することになる)
.+? 任意の文字列を非欲張り型でマッチ。.+?aは[^a]+と同義となる。また、.*?aは[^a]*と同義。バックトラックが起こらない分だけ、それぞれ同義のマッチ文字列の方が早い。