コンテンツにスキップ

Perl

なぜ生まれた?
awk では複数のファイルをたどる報告書が作れず、専用の道具を C で書くのも避けたかった。
何を解決した?
C・sed・awk・sh の得意なところを1つの言語にまとめ、抽出から報告書の出力までを書けた。
何を残した?
Web サーバーへの組み込みが難しく、互換を守り続けた内部は作り直しにくくなった。
登場
作者
Larry Wall
状態
現役

1986年ごろ、Larry Wall は、東西の両岸に分かれた6台の VAX を使うプロジェクトで、構成管理の仕組みづくりを任されていました。 同じ部屋にいた Daniel P. Faigin が、1989年11月の Usenet への投稿でそのときのことを語っています(会社の名前は書かれていません)。

版を管理する RCS では問題報告(Problem Report)を扱えないので、Wall はニュースの仕組みを問題報告の置き場にし、ニュースリーダーの rn で読んで承認か却下を付ける形にしました。 困ったのは、構成管理に欠かせない報告書でした。

“awk couldn’t handle going through multiple directories and multiple files, as are found in the news spool directory. Nor could it follow pointers from one file to another.” (awk は、ニュースのスプールのように、いくつものディレクトリとファイルをたどれなかった。あるファイルから別のファイルへの参照もたどれなかった)

求められた体裁の報告書も出せず、締め切りも迫っていました。Faigin はこの場面を “Hence, perl was born.”(こうして perl が生まれた)と結んでいます。 のちに Faigin が『Programming Perl』に寄せた文章では、Wall は “special-purpose tool”(専用の道具)を書きたくなかった、とされています。 Perl は、Web とは関係なく、ニュースの記事から報告書を作る仕事から始まりました。

なぜ awk や sed、C ではなく新しい言語が要ったのか

Section titled “なぜ awk や sed、C ではなく新しい言語が要ったのか”

作者本人の説明は、1.0 の man page にあります。

“If you have a problem that would ordinarily use sed or awk or sh, but it exceeds their capabilities or must run a little faster, and you don’t want to write the silly thing in C, then perl may be for you.” (ふだんなら sed や awk や sh で片づける問題なのに、それらの手に余るか、もう少し速く動かしたい。かといって C で書く気にはならない。そんなときは perl が向いているかもしれない)

同じ man page は、狙いを “practical … rather than beautiful”(美しさより実用)とし、C・sed・awk・sh のよいところを合わせたと書いています。 Perl が狙ったのは、小さな道具と C のあいだにある仕事でした。

Wall は版の記録 perlhist の冒頭で、“Perl 0 introduced Perl to my officemates. Perl 1 introduced Perl to the world”(Perl 0 は同室の仲間に、Perl 1 は世界に紹介した)と要約しています。 Faigin によれば、同室で使われた最初の Perl は連想配列もなく、man page は15ページでしたが、sed や awk より速く、ほかの仕事にも使われはじめました。

版の記録では、Perl 1.000 は1987年12月18日です。広く配られたのは1988年2月、Usenet の comp.sources.unix への掲載で、最初の10個のパッチも含んでいました。 モデレーターの Rich Salz は前書きに “Perl is kind of designed to make awk and sed semi-obsolete.”(Perl は awk と sed をなかば時代遅れにするよう作られている)と書いています。 この記事では、版の記録の1987年12月18日を登場としています。

「Practical Extraction and Report Language」は名前の由来なのか

Section titled “「Practical Extraction and Report Language」は名前の由来なのか”

1.0 の man page の名前の行は “perl - Practical Extraction and Report Language” です。ただ、Faigin の説明では、名前はこの言葉から作られたのではありません。 Wall は最初に妻の名から Gloria を考え、次に Pearl とし、同名のグラフィックス用の言語があったことと、“too lazy to type five letters”(5文字打つのが面倒)だったことから Perl にした、と Faigin は書いています。展開した言葉の “And” も Pearl の名残だと見ています。

同じ man page の最後には、“Perl actually stands for Pathologically Eclectic Rubbish Lister, but don’t tell anyone I said that.”(本当は「病的なほど何でも取り込む、がらくた一覧表示機」の略だが、内緒に)という冗談もあります。 展開した言葉は正式なものも冗談も作者の文書にありますが、名前そのものは Pearl を縮めたものです。

承認の記事が approve/ に、問題報告の記事が pr/ にあり、承認の記事には Article: 番号 の形で承認した報告の番号が書いてあるとします。 承認ごとに、指している報告を開いて件名を出す報告書を作ります。どちらもこの記事のための作例で、スプールのディレクトリで実行します。

当時の awk だけでは、記事の中の番号をもとに別のファイルを開けません。sh と sed でつなぐと次のようになります。

report.sh(sh と sed、作例)
#!/bin/sh
echo "Article Approved by Subject"
echo "------- ------------ -----------------------------"
for file in approve/*
do
n=`sed -n 's/^Article: *//p' $file`
who=`sed -n 's/^From: *//p' $file`
subj=`sed -n 's/^Subject: *//p' pr/$n`
echo "$n $who $subj"
done

Perl の側は、1.0 の man page に載っている機能だけで書いています(format による書式、コマンドの出力を読む open、$1)。

report.pl(Perl 1.0、作例)
format top =
Article Approved by Subject
------- ------------ -----------------------------
.
format stdout =
@<<<<<< @<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$n $who $subj
.
open(list, 'ls approve |') || die "Can't run ls";
while ($file = <list>) {
chop($file);
open(art, "approve/$file");
while (<art>) {
/^Article: *([0-9]+)/ && ($n = $1);
/^From: *(.*)/ && ($who = $1);
}
open(pr, "pr/$n");
while (<pr>) { /^Subject: *(.*)/ && ($subj = $1); }
write(stdout);
}

sh の側では記事1件ごとに sed が3回起動し、名前の長さが違えば列がずれます。 Perl の側では、一覧を取る ls のほかは1つのプロセスで、読んだ中身をもとに次のファイルを開けます。format の見本どおりに列がそろい、ページが変わると top の見出しを自動で出し直します。 1.0 にはまだ局所変数も再帰もありませんでしたが(同じ man page)、報告書を作る仕組みは最初からそろっていました。

1.0 の README は、問題やパッチを作者に送るよう求め(“Help save the world!”)、パッチは comp.sources.bugs に流すとしていました。 キットには awk のスクリプトを Perl に直す a2p と、sed 用の s2p も入っていて、手元の資産を持ち込めました。 man page は、多くのシステム管理の仕事にも向いていると書いています。

なぜ CGI の時代に Perl が使われたのか

Section titled “なぜ CGI の時代に Perl が使われたのか”

1993年11月に名前が付いた CGI は、Web サーバーが要求のたびに外部のプログラムを起動し、要求の情報を環境変数と標準入力で渡して、標準出力に書かれたものを返す取り決めです(くわしくは CGI)。 取り決めなので、何の言語で書いてもかまいません。

1997年の NCSA の入門は、CGI を書ける言語に C/C++、Fortran、PERL、TCL、Unix のシェルなどを挙げ、スクリプト言語はコンパイルが要らず “easier to debug, modify, and maintain”(デバッグや手直しや保守がしやすい)ので好まれる、と書いています。

CGI のプログラムが受け取るのは、環境変数とフォームの文字列です。値は & と = でつながれ、記号は % と16進数に置き換えられて届きます。 Perl は 1.0 から、環境変数を連想配列 $ENV{...} で読め、split・s///・tr で文字列を切ったり置き換えたりできました。 CGI に名前が付いたとき、Perl の安定版は1993年2月の 4.036 で、版の記録には “Very stable.”(とても安定)と添えられています。

その上に、CGI のための道具が重なっていきました。

道具何をしたか
cgi-lib.pl(Steven E. Brenner、1994年の著作権表示)require "cgi-lib.pl" して &ReadParse を呼ぶと、GET でも POST でもフォームの値をデコードして連想配列 %in に入れる
CGI.pm(Lincoln Stein)Perl 5 のモジュール。mod_perl の開発者は “the popular CGI.pm module”(人気の CGI.pm)と書いている
CPAN(1995年)Perl のスクリプトや文書、移植版などを ftp.funet.fi の1か所に集め、ほかのサイトにミラーを呼びかけた

CGI の記事の Perl の作例は、フォームの値のデコードを10行ほど自分で書いています。cgi-lib.pl を使えば、そこが1回の呼び出しになりました。

Perl 5 の告知で、Wall は拡張と再利用を掲げ、その目的を “so that the language itself can stabilize”(言語そのものが落ち着けるように)と書きました。機能を言語ではなくモジュールで足していく方針です。 翌1995年、Jarkko Hietaniemi は CPAN を Perl の資料の管理者たちに公開し、目標を “the Mother of All Perl Archives”(Perl のあらゆる資料の母)と書いています。

一方で、Perl の CGI を毎回起動する重さに困った人もいました。Rasmus Lerdorf は、1994〜95年ごろ、自分の履歴書のアクセスを数えるために書いた Perl の CGI を、Perl を毎回 fork する負荷を避けるため C で書き直しました。それが PHP の始まりです。

CGI では要求のたびに Perl が起動します。Web サーバーの中に Perl を入れれば起動は要りませんが、それが難しかったと mod_perl の開発者 Andreas Koenig は振り返っています。

“PHP was also around already, and was an embarrassing witness to Perl’s greatest weakness for server-side programming: that embedding Perl was a pain.” (PHP もすでにあり、サーバーサイドでの Perl のいちばんの弱点、つまり組み込むのがひどく面倒だということの、気まずい証人になっていた)

組み込むための仕組みは “undocumented and buggy”(文書がなく、不具合だらけ)だったといいます。 1996年3月、Gisle Aas が Apache に Perl を組み込む mod_perl の最初の版を書き、Doug MacEachern と Koenig が引き継ぎました。 7月には CGI のスクリプトを足すたびに作り直さなくて済む Apache::Registry が入り、1997年3月の CGI.pm 2.32 で、人気の CGI.pm も mod_perl の上で使えるようになります。

2000年7月、Wall は Perl の会議の “State of the Onion” の講演で Perl 6 を発表しました。 その場にいた Mark-Jason Dominus の報告は、Perl 5 の問題として、内部が “extremely convoluted”(ひどく入り組んでいる)ことと、“thirteen years of backward compatibility history”(13年分の後方互換の歴史)を挙げています。古いコードを壊せないので、関数を足すことも古い機能を外すことも難しい、という説明です。 Perl 6 は “a complete rewrite of Perl”(Perl の完全な書き直し)で、開発者たちは後方互換を捨てることに同意しました。主催した O’Reilly の発表は、18〜24か月で出すとしていました。

Perl 6(Raku)は Perl 5 の後継だったのか

Section titled “Perl 6(Raku)は Perl 5 の後継だったのか”

発表の時点では後継として計画され、Dominus の報告では、Wall は Perl 5 を見捨てないと約束しつつ “5.8 will be the final release of Perl 5”(5.8 が Perl 5 の最後のリリースになる)と話しています。 実際には、Perl 5 は 5.8.0(2002年7月)のあとも版を重ね、2019年10月には The Perl Foundation が、Wall の同意を得て Perl 6 が Raku と正式に改名されたと告知しました。 Perl 6 は Perl 5 の置き換えとして発表されましたが、Perl 5 はその後も続き、Perl 6 は Raku という別の名前になりました。

なお、2015年6月の perl 5.22.0 では、CGI モジュールがコアの配布物から外されています。

perlhist(2026年10月29日に確認)で最新の安定版は、2026年7月15日の Perl 5.44.0 です。2025年7月の 5.42.0 のあと、開発版の 5.43.x を重ねて出ました。

指標数字出典
サーバーサイドの言語がわかる Web サイトのうち、Perl を使う割合0.1%W3Techs(2026年10月29日)
この1年に Perl で本格的な開発をした回答者(全回答者)3.8%Stack Overflow Developer Survey 2025
同じく、仕事として開発する回答者3.4%Stack Overflow Developer Survey 2025

Web サイトの言語としてはわずかですが、開発者の調査では回答者の 3.8% がこの1年に Perl で開発しています。

  • 1986年ごろ、Wall はニュースに置いた問題報告から報告書を作ろうとして、awk ではファイルをまたげず、専用の道具も書きたくなかったため、新しい言語を作りました。
  • sed・awk・sh では足りず C では大げさな仕事を、抽出から報告書の書式まで1つの言語で書けるようにし、1988年2月に Usenet で広く配られました。
  • 文字列を切って置き換える力に cgi-lib.pl・CGI.pm・CPAN が重なり、1990年代の CGI のプログラムにも使われました。
  • 要求ごとに起動する重さと組み込みの難しさは mod_perl と PHP へ、互換を守り続けた内部の問題は Perl 6(のちの Raku)へつながりました。
  • 2026年10月時点で最新の安定版は 5.44.0 で、W3Techs では Web サイトの 0.1%、Stack Overflow の2025年の調査では回答者の 3.8% が使っています。

年表

  1. 版の記録にある Perl 1.000 の日付 perldoc.perl.org

  2. Usenet の comp.sources.unix に、最初の10個のパッチと合わせて Perl 1.0 が掲載される tuhs.org

  3. 最初の Camel 本が 4.000 を指せるよう版の番号を上げた Perl 4.000 が出る perldoc.perl.org

  4. モジュールとオブジェクト指向を備えた Perl 5.000 が出る perldoc.perl.org

  5. Jarkko Hietaniemi が CPAN を Perl の資料の管理者たちに公開する cpan.org

  6. Gisle Aas が Apache に Perl を組み込む mod_perl の最初の版を書く perl.apache.org

  7. Larry Wall が Perl の会議で、Perl を一から書き直す Perl 6 の計画を発表する perl.com

  8. perl 5.22.0 で CGI モジュールがコアの配布物から外される perldoc.perl.org

  9. The Perl Foundation が、Perl 6 が Raku と正式に改名されたと告知する news.perlfoundation.org

  10. Perl 5.44.0 が出る perldoc.perl.org

系譜

この技術が出てくる物語

出典