Perl

出典: フリー百科事典『ウィキペディア(Wikipedia)』

Perl
パラダイム マルチパラダイム
登場時期 1987年
最新リリース 5.10.0 / 2007年12月18日
型付け 動的型付け
影響を受けた言語 AWK, BASIC-PLUS, C, C++, Lisp, Pascal, sed, Unixシェル
影響を与えた言語 Python, PHP, Ruby
プラットフォーム クロスプラットフォーム
ライセンス GNU General Public License, Artistic License
ウェブサイト http://www.perl.org/
  

Perlパール)はラリー・ウォールによって作られたインタプリタ方式のプログラミング言語およびその処理系である。Perl言語は、記述の美しさよりも実用性をモットーにしており、CsedAWKシェルスクリプトなど他のプログラミング言語のすぐれた機能を取り入れている。Webページの掲示板やチャットなどのCGIやシステム管理、テキスト処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションMovable Typeなど。

言語処理系としてのperlはフリーソフトウェアであり、アーティスティック・ライセンスおよびGPLのもとで配布されており、誰でもどちらかのライセンスを選択して利用することができる。UNIXWindowsなどの多種のプラットフォームの上で動作する。

目次

[編集] 特徴

  • 強力な文字列演算機能 - 拡張された正規表現構文をサポートしている。
  • 組み込みの連想配列 (ハッシュ)
  • 許容度の高い文法 - 「TMTOWTDI ... There's More Than One Way To Do It(やり方はいくらでもある)」という言葉にあらわされるように、様々なスタイルで記述することができる。
  • 柔軟な拡張性 - CPAN参照。
  • リファレンス - C言語のポインタのようなもので、ポインタより安全に複雑なデータを扱える。
  • オブジェクト指向 - リファレンスをベースにした汎用オブジェクト指向システム。
  • リファレンスカウントによるリソースマネージメント。
  • クロージャのサポート。
  • スレッド - Perlのスレッドはデータが丸ごとコピーされるという点で概念的にUNIXLinuxforkに近い。
  • PerlIOレイヤ - 入出力操作に手を加えることが出来る。各レイヤはC言語で実装できるため高速である。
  • Encodeモジュール - 汎用エンコーディング操作モジュール。

Perl 5現在において、Perlとは言語の名前であると同時に唯一の実装の名前でもある。この実装はC言語によって書かれており、非常に安定している。

実行はランタイムコンパイル形式を取っている。スクリプトは実行前に仮想マシン向けにコンパイルされ、コンパイルされたバイトコードが実行される。Perlをインタプリタと呼ぶ人がいるが、この点では厳密には異なる。昨今のスクリプト言語ではこの形式が採用されることが多い。

また、Pythonのように一旦生成したバイトコードを保存して再利用することは少ない。これは現在のPerlのランタイムコンパイルが高速で、バイトコードから実行するメリットが少ないことが理由の一つである。コンパイル済みコードの再利用ではむしろmod_perl のような形式が好まれている(下記参照)。

開発中のPerl 6はParrotという仮想マシンによって動作する。現在、ParrotCodeへのコンパイルを行うHaskell言語で書かれたPugsという実装が開発されている。Perl 6により、長らく実装が一つしかないという状況がようやく変わろうとしている。

[編集] Webアプリケーションの実行

Webアプリケーションとして Perl スクリプトを実行する方法は、実行ファイル形式とモジュール形式の二つに分けることが出来る。実行ファイル形式は CGI / FastCGI / SpeedyCGI、モジュール形式は、mod_perl / ISAPI がある。

CGI が主な実行方法として知られているが、実行のたびにプロセスの読込・破棄を行っているため、オーバーヘッドが大きい。そのため、多くのアクセスを捌かなければならないWebアプリケーションでは、パフォーマンスが悪くなるために不適当な方法である。

そのため、CGI 以外の方法を用いて高速化する。FastCGI / SpeedyCGI は実装に差はあるものの、プロセスをメモリ上に永続的に置くことによりプロセスの読込・破棄の作業を省き、高速化を図っているものである。mod_perl は Apache に Perl を組み込むことにより、高速化を図るものである。初回起動時にコンパイルされたコードは、意図的に破棄されることがない限り何度も使用されるため、高速化が出来る。ただし、Apache のプロセスで Perl が動作するため、Perlの例外エラーはそのまま Apache のエラーへとつながる。また、CGIを想定して書かれた既存のスクリプトはmod_perlでは動かないことも多いため、それ専用に組み直す必要も出てきてしまう(なお、mod_perlの為に書いたスクリプトはCGIでも動作する)。

どの実行方法を使用するかは OS・HTTPd によって異なるが、次のような利用方法がある。

UNIX とその互換システム
Apache
  • CGI
  • FastCGI
  • SpeedyCGI
  • mod_perl
lighttpd
  • CGI
  • FastCGI
Windows
IIS
  • CGI
  • ISAPI
Apache
  • CGI
  • FastCGI
  • SpeedyCGI
  • mod_perl
  • ISAPI
AN HTTPD
  • CGI
  • ISAPI

[編集] 文法

[編集] Hello World

バックスラッシュ"\"は環境により半角円記号"¥"となる場合がある。


print "Hello, world!\n";


シェルからは以下のとおり。

 perl -e 'print "Hello, world!\n"'

または

 perl -le 'print "Hello, world!"'

[編集] コメント

#」以降は行末までがコメントである。


[編集] データ型

主なものとして、スカラー(Scalar)、配列(Array)、そしてハッシュ(Hash)がある。変数の先頭には変数の型を示すシジル(sigil)という記号を付与する。スカラーのシジルは「$」、配列は「@」、ハッシュは「%」となっている。

my $str   = "Hello, world";
my @array = (0, 1, 2);
my %hash  = ('one' => 1, 'two' => 2);

配列およびハッシュの各要素はスカラーであり、以下のようにアクセスする。

$array[1];   # 1;
$hash{'two'} # 2;

スカラーには数値、文字列、バイト列、そして#リファレンス(参照;Reference)を格納できる。

my $int    = 42;
my $float  = 3.14159265358979;
my $string = "\x{99f1}\x{99dd}";    # UTF-8で「駱駝」
my $bytes  = "\xe9\a7\b1\e9\a7\9d"; # バイト列で「駱駝」
my $sref   = \$int;                 # スカラーへのリファレンス
my $aref   = \@array;               # 配列へのリファレンス
my $href   = \%hash;                # ハッシュへのリファレンス

[編集] リファレンス

参照元にアクセス、すなわちデリファレンス(dereference)するには、シジルを変数名の頭につければよい。

my $s = $$sref;
my @a = @$aref;
my %h = %$href;

ただし、配列およびハッシュへの参照に関しては、その要素にアクセスするのに->を使うことができる。

$aref->[1];
$href->{'two'};

参照元のデータタイプを調べるには、refを使う。

ref 1;           # ''
ref $sref;       # 'SCALAR'
ref $aref;       # 'ARRAY'
ref $href;       # 'HASH'

参照元がオブジェクトの場合、ref はそのオブジェクトが所属するパッケージ名を返す。

ref A::B->new(); # たいてい 'A::B'

[編集] 制御構文

C言語に似たif,for,whileが使えるのに加えて、これらを後置することもできる。

if ($cond) { } elsif($cond2){ } else { }
doit if ($cond);
while($cond){ };
doit while($cond);
for(my $i = 0; $i < $count; $i++){ }
foreach(0..$count){ } # こちらの方がよく使われる。for(0..$count)でもOK
print for (@ARGV);

また、ifに対してunless、whileに対してuntilを持つ。

doit unless ($done); # doit if (! $done);
doit until ($done);  # doit while (! $done);

[編集] サブルーチン

サブルーチンは、以下のように定義する。

sub hello{
        print "Hello, world!\n";
}

呼び出しは、以下のとおり。

hello();
&hello();
hello;

サブルーチンは、関数としても機能する。その場合、最後に評価した値ないしreturnで指定された値が返り値(配列)となる。

sub hello{
        return "Hello, world\n"; # return は省略可能
}
print hello();

引数は、特殊変数@_に格納される。

# 丁寧に書いた例
sub mul{
        my ($op1, $op2) = @_;
        return $op1 * $op2;
}
 
sub mul{ $_[0] * $_[1] }; # こうも書ける

サブルーチンもリファレンスできる。

my $subref = \&mul;
warn $subref->(7,6); # 42

これを使って無名サブルーチンを作ることも出来る。

my $subref = sub{ $_[0], $_[1] };
print $subref->(1, 2);
print &$subref(1, 2);  # こうも書ける

[編集] パッケージ

パッケージ(package)とは、perlにおける名前空間(namespace)のことである。

package Foo;
our $bar = 'baz';
 
package main;
our $bar = 'quux';
warn $bar;      # 'quux';
warn $Foo::bar; # 'baz';

[編集] オブジェクト

Perlでは、上記のリファレンスとパッケージを組み合わせることにより、クラスベースのオブジェクト指向を実現している。

package Class;
sub new{    # コンストラクター
        my $pkg = shift;
        return bless { @_ }, $pkg;
}
sub meth{   # アクセサー
        my $self = shift;
        $self->{meth} = shift if @_;
        $self->{meth};
}

使う時は、以下のようにする。

my $obj = Class->new( meth => 'od' );
warn $obj->meth; # 'od';

なぜこれが動くのかというと実は、Perlはこれを以下のように解釈している。

my $obj = Class::new('Class', meth => 'od' );
warn Class::meth($obj);

Perlにおいて、クラスはただのパッケージであり、オブジェクトはただのblessされたリファレンスであり、そしてメソッドは第一引数にオブジェクトをとるただのサブルーチンである。

これはPerl 4との互換性を考慮してこのような「後付け」の設計となったのだが、驚くべき柔軟性を示す。これだけで継承委譲も出来てしまうのだ。最初からオブジェクト指向のもとに設計された言語から見ると見た目は変であるが、それらの言語にまさるとも劣らないオブジェクト機能をPerlは持っている。

[編集] CPAN

Perlプログラムには、モジュールによって機能を付加することができる。たとえば、他のプログラムやネットワークとの通信、各種ファイル形式の取り扱い、数学的な計算など、数多くのモジュールが存在する。CPANは、こういったモジュールを体系的に管理する組織であり、インターネット上のサービスである。Perlプログラムが動作しているコンピュータがインターネットに接続してあれば、半自動的にCPANにアクセスしてモジュールを取得してインストールを行うことが可能である。

詳細はCPANを参照。

[編集] 代表的なCPANモジュール

[編集] アーカイブ形式

PAR(Perl Archive Toolkit)[1]という、Perlスクリプトを実行環境ごとアーカイブし、単一のファイルにまとめるためのツールキットが存在する。JARのPerl版と考えてよい。

実行可能ファイルを作ることもできるため、アプリケーションの配布に適する。しかしその場合はPerl実行環境をまるごと含むため、ファイルサイズが大きくなる傾向にある。

[編集] 歴史

[編集] Perl 1.0

1987年12月18日にリリース。

[編集] Perl 5.0

1994年10月17日にリリース。

[編集] Perl 5.6.0

2000年5月22日にリリース。

our文やウィークリファレンス、warningsの導入など、言語コアが大きく拡張された。 実験的ながらユニコードのサポートを開始した最初のバージョン。 バージョン番号の構造を変更。サブバージョン(5.6.0の6に相当)が偶数のものが安定版、奇数のものが開発版を意味する。

[編集] Perl 5.8.0

2002年7月18日にリリース。5.8系列の最新版は5.8.8(2006年1月31日)。

汎用エンコーディング操作モジュールEncode.pmが標準ライブラリに加えられ、Shift_JISユニコードなど様々なエンコーディングに正式に対応した。また、スレッドやPerlIOレイヤーが導入された。

[編集] Perl 5.10.0

2007年12月18日にリリース。この日はPerl 1.0のリリースからちょうど20年目にあたる。

state文やswitch文、say関数などの言語拡張が導入された。また、新しいキーワードの導入による互換性の問題に対処するため、新しいキーワードの導入をfeatureプラグマで制御できるようになった。


[編集] 名称

「Perl」は当初、新約聖書の「マタイによる福音書」13章46節の「高価な真珠」にちなんで真珠を意味する「pearl」と名付けられた。ラリー・ウォールは肯定的な意味を持つ短い名前を選びたいと考えていて、彼によれば、3文字および4文字の単語を辞書から探して全て読んでみたが見あたらなかったということである。また、彼は妻のグロリアにちなんで名前を付けることも考えた。

Perl言語の正式なリリースの前に、すでに「pearl」という名前のプログラミング言語が存在することに気づき、綴りを変更して「Perl」とした。このように、「Perl」は略語ではなく、元々意味は無いが、あとからいくつかの意味が考えられている。正式なマニュアルでは、Practical Extraction and Report Language(実用的なデータ取得レポート作成言語)の意味であるとしている。Pathologically Eclectic Rubbish Lister(病的折衷主義のガラクタ出力装置)[2]という少し皮肉な意味も考えられている。「Perl」という名称の記述においては、若干の注意が必要である。Perl言語を示すときは「Perl」というように、頭文字を大文字にして固有名詞であることをはっきりさせる。Perl言語の、現在配布されている唯一の言語処理系は「perl」という名前である。一般に「perlだけがPerl言語を解釈することができる」という表現がなされる。「PERL」のように全てを大文字にするのは誤りである。

[編集]

  1. ^ http://search.cpan.org/dist/PAR/
  2. ^ プログラミング Perl VOLUME 1 ISBN 4-87311-096-3

[編集] 参考文献

[編集] 関連項目

[編集] 外部リンク

ウィキブックス
ウィキブックスPerl関連の教科書や解説書があります。