Perl

出典: Wikipedio


Template:Infobox プログラミング言語 Template:プログラミング言語 Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。記述の美しさよりも実用性と多様性をモットーにしており、Csedawkシェルスクリプトなど他のプログラミング言語やスクリプト言語の優れた機能を取り入れている。CGIスクリプトやシステム管理、テキスト処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションMovable Typeなど。

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

目次

概要

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

Perlの正式なリリースの前に、すでに「pearl」という名前のプログラミング言語が存在することに気づき、綴りを変更して「Perl」とした。このようにPerlは略語ではなく、もともと意味はないが、あとからいくつかの意味が考えられている。開発者ラリー自身によると、Practical Extraction and Report Language(実用的なデータ取得レポート作成言語)という意味を持ち、同時にPathologically Eclectic Rubbish Lister(病的折衷主義のガラクタ出力装置)<ref name="progperl1">プログラミング Perl VOLUME 1 ISBN 4-87311-096-3</ref>という少し皮肉な意味も込められている。

Perlという名称の記述においては、若干の注意が必要である。プログラミング言語としてのPerlを示すときは「Perl」というように、頭文字を大文字にして固有名詞であることをはっきりさせる。Perl 5の現在開発されている唯一の処理系は「perl」という名前である。一般に「perlだけがPerlを解釈することができる」という表現がなされる。「PERL」のようにすべてを大文字にするのは誤りである。

このようにPerl 5現在において、Perlとは言語の名前であると同時に唯一の処理系の名前でもある。この処理系はC言語で書かれている。スクリプトは実行前に仮想機械向けにコンパイルされ、コンパイルされたバイトコードが実行される(ランタイムコンパイル)。そのため、厳密にはインタプリタとは異なる。

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

PAR (Perl Archive Toolkit) というPerlスクリプトを実行環境ごとアーカイブし、単一のファイルにまとめるためのツールキットも存在する。JARのPerl版と考えてよい。実行可能ファイルを作ることもできるため、アプリケーションの配布に適する。しかしその場合はPerl実行環境をまるごと含むため、ファイルサイズが大きくなる傾向にある。

開発中のPerl 6はParrotという仮想機械の上で動作する。現在、ParrotCodeへのコンパイルを行うHaskellで書かれたPugsという処理系が開発されており、Perl 6ではPerl 5と違って複数の実装が公開される予定である。

特徴

  • 強力な文字列演算機能
    拡張された正規表現構文をサポートしている。
  • 組み込みの連想配列(ハッシュ)
  • 許容度の高い文法
    「TMTOWTDI (There's more than one way to do it)」という言葉で表されるように、プログラムを様々なスタイルで記述することができる。
  • 柔軟な拡張性
    CPANを参照。
  • リファレンス
    C言語におけるポインタのようなものだが、ポインタより安全に複雑なデータを扱える。
  • オブジェクト指向のサポート
    リファレンスをベースにした汎用オブジェクト指向システムを備えている。
  • リファレンスカウントによるリソースマネージメント
  • 第一級関数クロージャ)のサポート
  • リフレクションのサポート
  • スレッド
    Perlのスレッドはデータが丸ごとコピーされるという点で概念的にUNIXやLinuxforkに近い。
  • PerlIOレイヤ
    入出力操作に手を加えることができる。各レイヤはC言語で実装できるため高速である。

歴史

Perl 1.0

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

Perl 2.0

1988年6月05日にリリース。

Perl 3.0

1989年10月18日にリリース。

Perl 4.0

1991年3月21日にリリース。

Perl 5.0

1994年10月17日にリリース。リファレンスおよびオブジェクト指向に対応。また、useが導入され追加モジュールの取扱いが大幅に強化された。

Perl 5.5.0

1998年7月22日にリリース。正規表現の拡張、B::*モジュールによるフックのサポート、qr// 正規表現演算子の追加がなされた。BeOS を含む幅広いオペレーティングシステムに移植された。日本国内で最も重要なことは、このバージョンが JPerl がサポートする最後のバージョンということである。したがって今なお広く使われており、保守の継続を望む声も根強い。

Perl 5.6.0

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

Perl 5.8.0

2002年7月18日にリリース。5.8系列の最新版は5.8.9(2008年12月14日)。汎用文字エンコーディング操作モジュールEncodeが標準ライブラリに加えられ、UnicodeおよびShift_JISなどの様々な文字エンコーディングに正式に対応した。また、スレッドやPerlIOレイヤが導入された。

Perl 5.10.0

2007年12月18日にリリース。この日はPerl 1.0のリリースからちょうど20年目にあたる。静的変数を宣言するstate文や、switch文に相当するgiven文、sayなどの言語拡張が導入された。また、新しいキーワードの導入による互換性の問題に対処するため、新しいキーワードの導入をfeatureプラグマで制御できるようになった。

Perl 5.12.0

2010年4月13日にリリース。packageのバージョン指定構文や未実装部分を表す...演算子、後置のwhen修飾子などが導入された。また、日付と時刻に関するコアモジュールが2038年問題に対応した。

CPAN

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

Template:Main

代表的なCPANモジュール

ウェブアプリケーション

Perlスクリプトは実行ファイル形式またはモジュール形式を用いてウェブアプリケーションとして実行することができる。実行ファイル形式はCGI、FastCGISpeedyCGI、モジュール形式はmod_perl、ISAPIなどがある。このうちCGIが主な実行方法として知られているが、実行のたびにプロセスの読込・破棄を行っているため、オーバーヘッドが大きい。そのため、多くのアクセスを処理しなければならないウェブアプリケーションでは、パフォーマンスが悪くなることがある。一方、FastCGI、SpeedyCGI、mod_perlなどの環境では、プロセスをメモリ上に永続的に置くことによりプロセスの読込・破棄の作業を省き、高速化を図っている。

上記の実行環境はそれぞれインターフェイスが異なるため、ウェブアプリケーションフレームワークごとに差異を吸収するコードが繰り返し再発明されていた。この問題を解決すべく、宮川達彦氏主導の元、WSGIRackにインスパイアされたPSGIというウェブアプリケーション フレームワーク用の規格が打ち出された<ref name="psgi1">http://gihyo.jp/news/report/01/yapcasia2009/0001 YAPC::Asia Tokyo 2009 スペシャルレポート</ref>。また、同時にPSGIのリファレンス実装のPlackも発表された 。これにより、具体的な実行環境を意識することなくウェブアプリケーションを作成できるようになった。2010年現在では、ほとんどのPerl製ウェブアプリケーションフレームワークがPSGIに対応している。

具体的にどの実行環境を使用するかはオペレーティングシステムやウェブサーバによって異なるが、次のような利用方法がある。

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

<source lang="perl"> print "Hello, world!\n"; </source>

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

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

または

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

Perl 5.10.0以降では改行を自動的に出力するsayが使えるようになった。

<source lang="perl"> use 5.10.0; say "Hello, world!"; </source>

シェルからはuse 5.10.0;の代わりに-Eスイッチを使用する。

perl -E 'say "Hello, world!"'

コメント

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

<source lang="perl">

  1. ここは
  2. コメント
  3. です。

print "Hello, world!\n"; # "Hello world!" と出力 </source>

PODによるドキュメンテーション用の記法を用いると複数行コメントを書くことができるが、あまり用いられない。

<source lang="perl"> =begin comment ここは コメント です。 =end comment </source>

データ型

主なデータ型としてスカラ、配列、そしてハッシュがある。変数名の前にシジル (sigil) と呼ばれる記号を付けることによって、これらを区別する。スカラのシジルは「$」、配列は「@」、ハッシュは「%」となっている。

<source lang="perl"> my $num = 2 + 3; my $str = "Hello, world"; my @array = ( 0, 1, 2 ); my %hash = ( zero => 0, one => 1, two => 2 ); </source>

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

<source lang="perl"> $array[0]; # 0 $hash{two} # 2 </source>

スカラには数値、文字列、バイト列、そしてリファレンスを格納することができる。

<source lang="perl"> my $int = 42; my $float = 3.14159265358979; my $string = "\x{99f1}\x{99dd}"; # UTF-8で「駱駝」 my $bytes = "\xe9\xa7\xb1\xe9\xa7\x9d"; # バイト列で「駱駝」 </source>

制御構文

C言語に似たif文for文while文が使える上、これらを修飾子として後置することもできる。

<source lang="perl"> if ( $cond0 ) {

   # ...

} elsif ( $cond1 ) {

   # ...

} else {

   # ...

}

print "$cond is true" if $cond;

while ($cond) {

   # ...

}

print "$cond is true" while $cond;

for ( my $i = 0; $i < $count; $i++ ) {

   # ...

}

  1. 上記のCスタイルのfor文よりもこちらの方がよく使われる。for ( 0 .. $count ) {でもよい。

foreach ( 0 .. $count ) {

   # ...

}

print $_ for @ARGV; print for @ARGV; # 同上 </source>

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

<source lang="perl">

  1. if ( !$done ) {

unless ($done) {

  # ...

}

  1. while ( !$done ) {

until ($done) {

  # ...

} </source>

サブルーチン

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

<source lang="perl"> sub hello {

   print "Hello, world!\n";

} </source>

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

<source lang="perl"> hello(); hello; &hello(); </source>

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

<source lang="perl"> sub hello {

   return "Hello, world\n"; # return は省略可能

} print hello(); # "Hello, world!" と表示 </source>

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

<source lang="perl">

  1. 丁寧に書いた例

sub mul {

   my ( $left, $right ) = @_;
   return $left * $right;

}

sub mul { $_[0] * $_[1] }; # こうも書ける </source>

リファレンス

データに直接アクセスするのではなく、データの存在するメモリアドレスをスカラ値として定義するリファレンスを使用することができる。スカラ、配列、ハッシュ、ファイルハンドル、サブルーチンのリファレンスが存在する。

<source lang="perl"> my $scalar_ref = \$scalar; # スカラへのリファレンス my $array_ref = \@array; # 配列へのリファレンス my $hash_ref = \%hash; # ハッシュへのリファレンス my $sub_ref = \⊂ # サブルーチンへのリファレンス open my $fh, '<', $file; # $fhがファイルハンドルへのリファレンス </source>

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

<source lang="perl"> my $scalar = $$scalar_ref; my @array = @$array_ref; my %hash = %$hash_ref; my $sub = &$sub_ref(2, 3); # サブルーチン呼び出し -- $sub には戻り値が入る </source>

ただし、配列・ハッシュおよびサブルーチンへのリファレンスに関しては、その要素にアクセスするのに(あるいはサブルーチンを呼び出すのに)->を使うことができる。

<source lang="perl"> $array_ref->[0]; $hash_ref->{two}; $sub_ref->(2, 3); </source>

配列・ハッシュについては、配列名・ハッシュ名が定義されておらずリファレンスからのみアクセスできる無名配列・無名ハッシュを作成することができる。

<source lang="perl"> my $array_ref = [ 0, 1, 2 ]; # 無名配列 my $hash_ref = { zero => 0, one => 1, two => 2 }; # 無名ハッシュ </source>

また、無名サブルーチンを作ることもできる。

<source lang="perl"> my $sub_ref = sub { $_[0] * $_[1] }; print $sub_ref->(2, 3), "\n"; # 6 を出力 print &$sub_ref(2, 3), "\n"; # こうも書けるが、読みにくいためあまり使われない </source>

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

<source lang="perl"> ref 1; # ref $scalar_ref; # 'SCALAR' ref $array_ref; # 'ARRAY' ref $hash_ref; # 'HASH' </source>

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

<source lang="perl"> ref Foo::Bar->new(); # たいてい 'Foo::Bar' </source>

パッケージ

パッケージとは、Perlにおける名前空間のことである。

<source lang="perl"> package Foo; our $bar = 'baz';

package main; our $bar = 'quux'; warn $bar; # 'quux' warn $Foo::bar; # 'baz' </source>

オブジェクト

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

<source lang="perl"> package Class;

  1. コンストラクタ

sub new {

   my $class = shift;
   my $self  = { @_ };
   bless $self, $class;

}

  1. アクセサ

sub meth {

   my $self = shift;
   $self->{meth} = shift if @_;
   $self->{meth};

} </source>

オブジェクトを使うときは以下のようにする。

<source lang="perl"> my $obj = Class->new( meth => 'od' ); warn $obj->meth; # 'od'; </source>

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

<source lang="perl"> my $obj = Class::new( 'Class', meth => 'od' ); warn Class::meth($obj); </source>

Perlにおいて、クラスはただのパッケージであり、オブジェクトはただのblessされたリファレンスであり、そしてメソッドは第一引数にオブジェクトをとるただのサブルーチンである。これはPerl 4との互換性を考慮してこのような「後付け」の設計となったのだが、驚くべき柔軟性を示す。これだけで継承委譲も出来てしまうのだ。最初からオブジェクト指向のもとに設計された言語から見ると見た目は変であるが、それらの言語にまさるとも劣らないオブジェクト機能をPerlは持っている。

脚注

<references />

参考文献

関連項目

Template:Portal

外部リンク

Template:Wikibooks

Template:FOSSals:Perl ar:بيرل bat-smg:Perl bg:Пърл (език за програмиране) bn:পার্ল (প্রোগ্রামিং ভাষা) bs:Perl ca:Perl ckb:پێرڵ (وێب داڕشتن) cs:Perl da:Perl de:Perl (Programmiersprache) el:Perl en:Perl eo:Perl es:Perl et:Perl eu:Perl fa:زبان برنامه‌نویسی پرل fi:Perl fr:Perl (langage) ga:Perl gl:Perl gu:પર્લ he:Perl hi:पर्ल hr:Perl hu:Perl (programozási nyelv) id:Perl it:Perl ka:პერლი ko:펄 ku:Perl la:Perl lb:Perl (Programméiersprooch) lt:Perl lv:Perl mk:Perl ml:പേള്‍ ms:Perl nl:Perl (programmeertaal) nn:Perl no:Perl pdc:Perl pl:Perl pt:Perl ro:Perl ru:Perl sah:Perl sh:Perl simple:Perl sk:Perl sl:Perl sq:Perl sr:Програмски језик Перл sv:Perl ta:பெர்ள் tg:Перл (забони барномасозӣ) th:ภาษาเพิร์ล tr:Perl uk:Perl ur:Perl vi:Perl zh:Perl zh-min-nan:Perl

個人用ツール