Perl
読み:パール
外語:Perl: Practical Extraction and Report Language
スクリプト言語のひとつ。インタープリターはCで記述されている。
情報
- 枠組み ‐ 構造化、手続き型、オブジェクト指向
- 初出年 ‐ 1987(昭和62)年
- 設計者 ‐ Larry Wall
- 開発者 ‐ Perlコミュニティ
- 最新版 ‐ Perl 5
- 言語影響関係
- 主要動作環境 ‐ 様々な環境
- ライセンス ‐ GPLとArtistic Licenseのデュアルライセンス
- 記述言語 ‐ C
概要
沿革
- 1987(昭和62)年12月19日 ‐ Perl 1.0 : Larryの仕事で必要となったawkの機能拡張から生まれた。
- 1988(昭和63)年6月5日 ‐ Perl 2.0 : Henry Spencerの正規表現ライブラリをアレンジし導入した。
- 1989(平成元)年10月18日 ‐ Perl 3.0 : バイナリデータの処理をサポート。GPLのもとでリリースされるようになった。
- 1991(平成3)年3月21日 ‐ Perl 4.0 : 最初のラクダ本とともにリリースされた。Artistic LicenseとGPLのデュアルライセンスになった。
- 1994(平成6)年10月17日 ‐ Perl 5.0 : リファレンスおよびオブジェクト指向をサポート。
- 1998(平成10)年7月22日 ‐ Perl 5.5.0 : JPerlがサポートする最後のバージョン。のちのUnicodeサポートによりJPerlは役目を終えた。
- 2000(平成12)年5月22日 ‐ Perl 5.6.0 : Unicodeサポートが試験的に追加された。また以後のバージョンはサブバージョン(5.6.0の6)が偶数が安定版、奇数が開発版を意味することになった。
- 2002(平成14)年7月18日 ‐ Perl 5.8.0 : EncodeモジュールやPerlIOが追加され、Unicodeサポートが一応の完成を見た。
- 2007(平成19)年12月18日 ‐ Perl 5.10.0 : Perl 1.0のリリースからちょうど20年目の日にリリースされた。featureプラグマで新機能の使用を制御できるようになった。
- 2011(平成23)年5月14日 ‐ Perl 5.14.0 : Unicode 6.0やIPv6サポートの改善、packageのブロック式記述などが追加された。ハッシュや配列を操作する組み込み関数にそのリファレンスを渡せるようになった。
名前の由来
Larryは言語の名前を考えるに際し辞書から3,4文字程度の短い単語を探したが、結果的にPearl(真珠)を採用した。しかし、同名の言語の存在や「5文字では長すぎる」という理由から、Perlという名前になった(Aの名残は頭字語の組み合わせにみられる)。
Perlは、Practical Extraction and Report Language(実用データ取得レポート作成言語)またはPathologically Eclectic Rubbish Lister(病的折衷主義のがらくた出力機)の頭字語とされている。
特徴
得意分野
主に文字列操作を得意とする言語で、特に言語に組み込まれた強力な正規表現は有名。
TMTOWTDI(There's More Than One Way To Do It./やり方はひとつじゃない)をモットーに、同じ処理でも複数の書き方ができる自由さが特徴である。
スクリプト言語としては比較的速い実行速度に加え、コーディングの時間を短くできることを重視している。
逐次型の手続き型言語としてもオブジェクト指向言語としても使え、1行スクリプトから大規模プログラミングまで多くの条件で快適なコーディングができるとされる。
言語設計
動的型付け、動的配列(可変長配列)、ハッシュ(連想配列)、クロージャーのサポートなどが特徴としてあげられる。
その他いくつかの言語の特徴を挙げる。
折衷
Perlは、Cのようなブロックの見た目や制御文をもち、Lispのように変数に型が無く、$のつく変数や'()'の無い関数(演算子)さらにコメントの書式はシェルスクリプト似で、C++のようにオブジェクトを呼び出せて、sedのごとくパターンマッチが出来、英語のように後置構文がある……。
Perlは多くの言語の特徴をアレンジしつつ内包しており、しかも同じ機能を実現する書き方を統一せず複数の書き方を可能にしている。これによりそれぞれのプログラマがそれぞれ慣れた書き方でPerlをかけるようになっている。
変数
'use strict;'プラグマを有効にしない限り、グローバル変数が宣言無しで利用できるが、my(ローカル変数)、local(レクシカル変数)、our(グローバル変数)などの種別をつけて宣言する方が望ましい。
変数の前にはその種類に応じて'$'(スカラー変数)、'@'(配列変数)、'%'(ハッシュ変数)のプレフィクス(ファニー文字という)がつき、予約語とバッティングしないようになっている。
いくつかの特殊変数があり、それらを通じて環境変数やPerlの機能などを参照、変更できる。
リファレンス(参照)
Cのポインターに相当する「リファレンス(参照)」という仕組みを備えており、配列などを内容をコピーすることなく参照先だけ渡すことができる。
このリファレンスは通常の変数に格納でき、'->'演算子などで「デリファレンス(実体化)」される。
また無名リファレンスを連鎖することにより複雑なデータ構造を作り上げることができる。
パターンマッチ(正規表現)
今日多くのプログラミング言語でパターンマッチは使えるが、Perlはその成り立ちからパターンマッチが言語組み込みで、UNIXで標準的なsedなどの書き方に似た特別な構文が用意されている。
正規表現の内容は、POSIXの拡張正規表現にPerl独自の拡張(最長/最短マッチの選択、再帰、コメント、複数行記述など)を施したようなもので、非常に強力である。
サブルーチン(関数)
PerlではC言語の関数にあたるもの('printf()'など)、演算子に当たるもの('+'など)含めて、全て演算子として振る舞うようになっている。
printfなどの複数の値を取るものはリスト演算子、popなど単一の値を取るものは単項演算子として振る舞う。また複数の値(リスト)を返せる。
演算子には'()'がいらない(ただの優先度決定の意味しか持たない)ので、シェルスクリプトのような書き方が可能となる。
print join '-',map {"[$_]"} grep /^\d+$/,sort keys shift;
パッケージ(名前空間)
'package Package::Name;'のような宣言でパッケージ(名前空間)が宣言できる。
packageはブロックの宣言('package Package::Name{...}')ではなく文であり、この文以降のスクリプトファイル内に書かれた内容がその名前空間に属することとなる(5.14でブロックでの宣言も可能となった)。
package文が再び出てくれば、それ以降の内容は2番目に出てきたpackageの名前に属することとなる。
パッケージ名は'::'で区切られ、階層化することが可能である。
また、package文のない部分のスクリプトは自動的に'main'パッケージの内容であると見なされる。Perlにはmain関数がないが、現在では'main'パッケージに書かれた内容を逐次実行することになっている。
オブジェクト指向
リファレンスとパッケージの仕組みを組み合わせることによってクラスベースのオブジェクト指向を実現している。
package Class; # Classパッケージ
sub new{ # コンストラクタ
my $package = shift; # 第一引数にパッケージ名(クラス名に相当)
my $arg = shift;
my $data = {true => $arg}; # インスタンス変数
return bless $data,$package; # オブジェクトを返す
}
sub prn{ # メソッド
my $self = shift; # 第一引数にオブジェクト
my $str = shift;
print $str,$self->{true};
}
package main; # main
my $object = Class->new(42); # インスタンス化
$object->prn('awk'); # メソッド呼び出し
# 出力:awk42
オブジェクトは'bless'関数で生成される、パッケージ名とデータを格納するリファレンス(インスタンス変数の働きをする)からなるデータである。
メソッドは単なるパッケージ関数で、メソッド呼び出し'->'は左辺のクラス名またはオブジェクトを右辺の関数の第一引数に設定し関数を呼び出す演算子で、コンストラクタはオブジェクトを返す単なるパッケージ関数(名前は任意)である。
継承はスーパークラスのパッケージ名を決められた変数へ記録するだけである。
この単純な仕組みでできているオブジェクト指向だが、クラスベースのオブジェクト指向として他の言語(C++など)と遜色ない機能を実現している。
ただし'private'などアクセスを司る制御がないゆえにアクセス規制は少々面倒である(クロージャなどを使い可能)。
自然言語のように
設計者のLarry Wallが言語学者だったことなどから、Perlは通常のプログラミング言語より自然言語的な振る舞いをするようになっている。
コンテクスト
コンテクスト(文脈)という仕組みにより、同じ変数でも状況により評価された値が変わることがある。
関数などの使用により、「単一の値(スカラ)/複数の値(リスト)」、「数値/文字列」を要求される文脈ができ、その状況に応じて適切な値を返す。
例えば配列をスカラコンテクスト(スカラを要求する文脈)で評価して、配列の内容ではなく要素数をかえすなどの用途が考えられる。
暗黙の変数
「標準的」な使い方に便利なように、一部の演算子(関数含む)に引数を与えない場合は暗黙の変数をとることになっている。
暗黙の変数は$_、@_、%_等の変数で、例えばshiftは@_の内容を操作し、printは$_の内容を表示するような動作をする。
ファイル行読み演算子<FILEHANDLE>が読み込んだ行の内容を$_にいれる動作などとも調和し、少ない文字数で処理がかけるようになっている。
これは、時にPerlスクリプトの可読性を損ねる一因ともされる。
短く
自然言語のように略語や短い語によって記述量を減らそうとするむきもある。
- Pearl → Perl
- #include/import → use
- continue → next
- break → last
- else if → elsif
- private → my (意味はやや異なるが)
- public → our (意味はやや異なるが)
- readline FILEHANDLE → <FILEHANDLE>
- function(@args); → function @args; で1文字省略可能
- return省略で最後の評価値が返る
- package宣言が文なのでJavaのclassなどより1段インデントを減らせる
- print → say
Perlのコーディング
複数の書き方ができること、デフォルトで変数に宣言がいらないこと、暗黙の変数などの略記に適した構文などが用意されていることなどから、Perlはコーディングの早さ、簡単さに関してアドバンテージを持つとされる。
これにより「ワンライナー」と呼ばれる1行プログラミングの発達やシェルスクリプト的なグルー言語としての地位を手に入れるに至った。
また制約が緩く、全容を知らずともそこそこのプログラムが書けるので、学習曲線が緩くなる効果もある(その代わり長いが)。
しかしその弊害か、「書き捨て」られるコードやスパゲッティプログラムの生まれやすい環境だと言われ、より整理されたとされるPHP、Rubyなどが新規のプログラミング人口にすすめられる要因にもなっている。
このように自由すぎるのも保守管理の弊害となるので、特に中規模以上のプログラムを作成する際は'use strict;'や'use warnings;'なるプラグマをつけてある程度の制限を課しつつプログラミングを行なうことが近年では推奨されている。
普及
元々UNIXのシステム管理などに利用されていたが、WWWのCGIの仕様が決まった際に存在した文字列処理に長けていて簡単にかける言語という特徴からCGI実装用言語として爆発的普及を見た。
普及当初は「初心者向け」の安易な入門などが出回ったせいもあってか、手続き的でスパゲティ風味なコードが量産されていったという。Perl4くらいまでは手続き的なプログラムが普通だった。
今ではPHPなど類似の言語も出てきたせいもありそれほどの勢いはないが、いまだ数多くのWebサイトを絶妙なバランスの元、陰で支えているのであろう。
互換性
基本的に後方互換性は保つ方針で、Perl4のスクリプトであっても僅かな変更で現在最新のPerlで動くという。
また、多くのプラットフォームに移植されているが、一部のプラットフォーム依存のライブラリ(Win32::など)を使わない限り非常に高い互換性を持つようになっている。
文字コード
Perl4のころまでは、日本語などの文字に対応していなかった。この当時はシフトJISが主流で、電子メールはISO-2022-JPが使われていた。文字をバイト列として処理していたため、C等と同じく日本語文字の処理には不便があった。
これを克服するために、jcode.plやJcode.pm、JPerlなどのツールが作られ、文字コードの変換が行なわれていた。文書ファイル(シフトJISやEUC-JP)と電子メール(ISO-2022-JP)の変換処理などで活躍した。
Perl5.6から段階的にUTF-8やPerlIOと呼ばれる多バイト文字列処理の仕組みが導入され、現在最新のPerlでは日本語などの多バイト文字を「内部文字列」として統一的に扱うことで、文字を自然に扱うことができる。
ライブラリ
CPANというサイトでPerlのモジュールが数多く公開されていて、再利用という形でオブジェクト指向プログラミングの恩恵を受けることができる。
このサイトにはPerlユーザーが登録すれば誰でもモジュールが公開できるようになっている。この非常に多くの有用なモジュールが、古くから続くPerlの資産になっている。
Perl6
現状最新のPerlのメジャーバージョンは5だが、後継としてPerl6なるものが開発中である。
これはPerl4→5のような互換性を保った変革ではなく、Perlの思想だけ残して抜本的に全てを書き換える計画だといい、Perl5との互換性はないとされる。
Perlは「実装が仕様」のような状態で長年やってきたが、Perl6は仕様を先に決めそれから実装することが決められている。
またPerlに限らない汎用な動的型付けインタプリタを目指すParrotという環境がPerl6に関連して開発中である。
このように5と6はフルスクラッチレベルで異なるので、Perl5とPerl6は名前が似ている別言語のような扱いとし、両者とも開発が続けられるというような方向性で動いているらしい。
関連情報
Perlの商標
日本においては、PerlはYet Another society(The Perl Foundationの別名)、和名「イェット アナザー ソサイエティー」が商標申請中だった。
- 商標出願番号 商願2007-92708 (出願日 2007(平成19)年8月29日)
ところが2009(平成21)年11月2日、株式会社テラ・インターナショナル(代表、北畠徹也)の名義で「Perl」を登録出願された商標が、2010(平成22)年3月1日に登録査定、そして2010(平成22)年4月9日に設定登録された。
- 商標登録番号 第5314384号 (出願日 2009(平成21)年11月2日)
- 第42類 ‐ 電子計算機のプログラムの設計・作成又は保守,電子計算機の貸与,電子計算機用プログラムの提供
このためコンピューター業界では大問題となり、SlashdotでもPerl、勝手に商標登録される。「OPENSOURCE」や「RUBY」「Apache」も申請中などのストーリーが立てられた。
この登録には異議が申し立てられた(異議2010-900199)。商標登録異議申立人は、神奈川県川崎市の柏木一浩(誰かは不明)と、商標出願中のアメリカの「イェット アナザー ソサイエティー」である。
最終的に、「登録第5314384号商標の商標登録を取り消す。」となった。理由として、次のように述べられている。
5 当審の判断
本件に関し、平成23年2月9日付けで、前記4の取消理由を通知し、期間を指定して意見書を提出する機会を与えたが、商標権者からは何らの応答もなかった。
本件商標についてした上記の取消理由は妥当であるから、その登録は商標法第4条第1項第15号に違反してされたものといわざるを得ない。
したがって、他の理由について判断するまでもなく、本件商標の登録は、同法第43条の3第2項の規定により、取り消すべきものとする。
よって、結論のとおり決定する
平成23年8月1日
審判長 特許庁審判官 鈴木修
特許庁審判官 内山進
特許庁審判官 前山るり子
再検索