コンテンツにスキップ

Perl

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

これはこのページの過去の版です。Perlcodesample (会話 | 投稿記録) による 2013年4月4日 (木) 06:33個人設定で未設定ならUTC)時点の版 (分割提案のタグを削除)であり、現在の版とは大きく異なる場合があります。

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

Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、Csedawkシェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。Webアプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。

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

特徴

  • 強力な文字列処理。正規表現をサポート
  • 日本語をはじめとして世界中の言語を処理可能
  • 連想配列(ハッシュ)をサポート
  • 多次元データ構造が利用可能
  • 自由度の高い文法。簡潔にプログラムを記述できる
  • 高い後方互換性を持つ
  • 数多くのオペレーティングシステムで利用可能
  • プログラムの実行には事前コンパイルは不要
  • スクリプト言語の中では高い処理速度を持つ
  • Unicodeのサポート
  • モジュールによる拡張が可能
  • 有志によって開発された豊富なモジュール(CPANを参照)
  • オブジェクト指向プログラミングのサポート
  • リファレンスカウント方式によるガーベッジコレクション
  • 例外処理のサポート
  • クロージャのサポート
  • リフレクションのサポート

Hello world

print "Hello, world!\n";

文法

コメント

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

# ここはコメントです。

変数

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

変数は初期化の仕方によって、スコープが異なったものになる。

より高速で安全なmy宣言が導入されたPerl 5.0以降、local宣言は非推奨となっている[1]

下のコードは my を使って変数を宣言し、同時に初期化する例である。local宣言もキーワードが異なるのみで同様である。

{
    my $num     = 2 + 3;
    my $message = "Hello, world";
    my @nums    = (0, 1, 2);
    my %score   = (english => 100, math => 80);
    # これらの変数は開き括弧「{」から閉じ括弧「}」までの間で有効。
}

配列およびハッシュの各要素はスカラであり、以下のようにアクセスする。ひとつの要素にアクセスするときは、変数が配列やハッシュであっても「$」を使う。

$nums[0]; # 0
$score{math} # 80

スカラには数値、文字列などを格納することができる。

$jackBauer = 24;
$pi = 3.14159265358979;
$vulcanSalute = 'Live long and Prosper!';

条件分岐

条件分岐を行うには「if ~ elsif ~ else」を利用する。

if (条件1) {
     処理1が真の場合の処理 
}
elsif (条件2) {
     条件1が偽で条件2が真の場合の処理 
}
else {
     条件1も条件2も偽の場合の処理 
}

条件分岐後の処理は文がひとつの場合でも必ず中括弧「{~}」で囲まねばならない。

ifは修飾子として後置することもできる。この場合は逆に中括弧で囲むことはできず、ひとつの文しか指定できない。

print 'Hello' if 条件 ;

ifに対してunlessが存在する。ifとは反対に条件が満たされなかった場合に処理が実行される。

unless (条件) {
     条件が偽の場合の処理 
}

print 'Hello' unless 条件 ;

繰り返し

繰り返しにはwhile、for、foreachを利用する。

while

whileでは条件が満たされる間、処理が繰り返される。

while (条件) {
    # 処理
}

for

forは規則性のある仕方で変数を変化させるときに使う。

$sum = 0 ;
for (my $i = 0; $i < 10 ; ++$i) {
    $sum += $i;
}
for ($node = $doc->getFirstChild ; $node ; $node = $node->getNextSibling) {
    print $node->getNodeValue, "\n";
}

foreach

foreachはすべての配列の要素を順番に処理したい場合に利用される。

my @names = ('Tom', 'Mike', 'Bred');
foreach my $name (@names) {
    # 処理
}

(実際にはforeachはforの別名であり両者は同じものである。)

forやforeachは修飾子として後置することもできる。配列の各要素は順に$_という変数に渡される。

print $_ for @names;

繰り返し制御

lastで繰り返しを抜けることができる。

foreach my $name (@names) {
    last unless $name;
}

nextで次の繰り返しに移行できる。

foreach my $name (@names) {
    next unless $name;
}

サブルーチン

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

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

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

hello();
hello;
&hello();

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

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

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

# 丁寧に書いた例
sub mul {
    my ($left, $right) = @_;
    return $left * $right;
}

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

リファレンス

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

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

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

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

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

$array_ref->[0];
$hash_ref->{two};
$sub_ref->(2, 3);

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

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

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

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

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

ref 1;           # ''
ref $scalar_ref; # 'SCALAR'
ref $array_ref;  # 'ARRAY'
ref $hash_ref;   # 'HASH'

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

ref Foo::Bar->new(); # たいてい 'Foo::Bar'

モジュールの利用

モジュールを利用するにはuseを使用する。

use Net::FTP;

モジュールの読み込みと共に関数をインポートしたい場合は、モジュール名に続いて、関数名を並べるのが一般的である。

use File::Basename 'fileparse';

評価コンテキスト

評価コンテキスト、すなわち、構文上何が(リスト、数値、文字列、リファレンス、あるいは何もないのかが)要求されているかの違いにより評価値が変化する。 リストが数値スカラコンテキストで評価されると配列の長さに評価される。

$a = ("a", "b");  #数値スカラコンテキスト
print $a;         # 2 を出力
($x, $y) = ("a", "b"); #リストコンテキスト
print $x;              # a を出力

意味が大きく変わる表現も存在する。

@match = ("123 a 56 x" =~ m/\d+/g); #リストコンテキスト (全てを一度にマッチ)
# @match => ("123", "56")
$match = ("123 a 56 x") =~ m/\d+/g); #スカラコンテキスト (順次マッチ)
# $match => "1"

ブロックを呼び出したコンテキストがリストコンテキストかどうかをwantarray?で判別することができる。したがって、コンテキストによって返り値を切り替えるような関数をユーザーが定義することもできる。

例外処理

例外を発生させるにはdie関数を使う。例外が発生するとプログラムはメッセージを出力して終了する。

die "例外が発生しました。";

例外をキャッチするには「eval { };」を使用する。例外が発生した場合は特殊変数「$@」にメッセージが代入される。「$@」の値を調べることで例外が発生した場合の処理を記述できる。

eval {
    例外が発生する処理
};

if ($@) {
    例外が発生した場合の処理
}

パッケージ

Perlにおけるパッケージとは、一般的に名前空間と呼ばれる機能のことである。パッケージを宣言するには「package」を使う。

package Foo;

パッケージ内で宣言されたパッケージ変数とサブルーチンはパッケージに属するものとなる。パッケージ変数を宣言するには「our」を使う。パッケージ変数には大文字を利用するのが一般的である。

package Foo;

our $NUM = 1;

sub sum {
    ...
}

package Bar;

our $NUM = 2;

sub sum {
    ...
}

上記において、Fooパッケージのパッケージ変数$NUMとBarパッケージのパッケージ変数$NUMはまったく別の変数である。またFooパッケージのsumとBarパッケージのsumはまったく別のサブルーチンである。パッケージ変数やサブルーチンはパッケージごとに定義することができる。

自パッケージ内であれば、パッケージ名の指定を行わずに、パッケージ変数やサブルーチンを参照することができる。

package Foo;

our $NUM = 1;

sub sum {
    ...
}

print $NUM;
print sum();

他のパッケージから参照するには、完全修飾を行う必要がある。mainはデフォルトのパッケージをあらわす。

package Foo;

our $NUM = 1;

sub sum {
    ...
}

package main;

print $Foo::NUM;
print Foo::sum();

オブジェクト

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

package Class;

# コンストラクタ
sub new {
    my $class = shift;
    my $self  = {@_};
    bless $self, $class;
}

# アクセサ
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は持っている。

ドキュメンテーション

ドキュメンテーションはPODを用いて記述する。

=head1 NAME

foo.pl

=head1 DESCRIPTION

this script is ...

=cut

ワンライナー

コマンドラインからワンライナーと呼ばれる機能を使って、Perlを実行することができる。

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

推奨されている記述

以下の2行をプログラムの先頭に記述することが強く推奨されている。

use strict;
use warnings;

strict は潜在的な問題をコンパイル時に調べるためのものであり、warnings は警告の出力を有効にするためものである。perl インタプリタを起動するときのコマンドラインオプションの -w とは似ているが同じではない。warnings の方がより細かいので use warnings を使って -w オプションは省略すればよい。

また、5.12 以降では use strict がデフォルトとなったため、書くことが推奨されるのは use warnings のみとなる。

use 5.014;
use warnings;

Perl 5.10 で追加された機能

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

use 5.10.0; # 5.10未満のPerlでの動作を制限するとともに、5.10での追加機能を有効に
say "Hello, world!";

シェルからは-eオプションの代わりに-Eを使用すれば、追加機能を利用できる。

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

その他の文法

飛び越しを行うには「goto」を利用する。goto の後ろには飛び越し先ブロックのラベルを書く。一般的にwhile/last/next などの繰り返し機構を使ってプログラムを書いたほうが、プログラムコードが読みやすくなるので、gotoが使われることは少ない。

goto destination ;

print "この print 文は実行されない。\n" ;

destination: {
    print "飛び越し先ブロック\n" ;
}

PODによる記法を用いると複数行コメントを書くことができる。(あまり利用されない)

=begin comment
ここは
コメント
です
=end comment

その他の特徴

  • スレッド
    Perlのスレッドはデータが丸ごとコピーされるという点で概念的にUNIXやLinuxforkに近い。iThreads(インタープリタスレッド)と呼ばれており、他のシステムにおけるどのスレッドとも実装は異なる。シグナルと同時に利用することで問題があるとも言われている。もともとWindows版にてforkのような実装を行うためのコードだったものから、発展している。[2]多くのLinuxディストリビューションではiThreadsをオンにして配布しているが、安全性重視をうたっているFreeBSDOpenBSDの標準ディストリビューションやOpenSolarisでは、iThreadsをオフにしている。
  • PerlIOレイヤ
    入出力操作に手を加えることができる。各レイヤはC言語で実装できるため高速である。

モジュール

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

標準モジュール

Perlには標準で利用できるモジュールが数多く存在する。

  • base - クラスの継承
  • Benchmark - ベンチマーク
  • Carp - 呼び出し元の観点で例外を発生
  • Cwd - カレントディレクトリのパスを取得
  • Data::Dumper - 変数の内容を出力
  • Digest::MD5 - MD5値
  • Encode - 文字列のエンコード・デコード
  • Exporter - 関数のエクスポート
  • File::Basename - ファイルのベース名とディレクトリ名の取得
  • File::Copy - ファイルの移動とコピー
  • File::Path - 複数階層のディレクトリの作成と削除
  • File::Spec - ファイル名に対する移植性のある処理
  • File::Temp - 一時ファイルの生成
  • FindBin - スクリプトが存在するディレクトリのパスの取得
  • Getopt::Long - コマンドライン引数の処理
  • lib - モジュールの検索パスを追加
  • List::Util - 配列に対する処理
  • Net::FTP - FTPクライアント
  • Scalar::Util - スカラ値のユーティリティ
  • Storable - データの直列化
  • Sys::Hostname - ホスト名の取得
  • Time::Piece - 日付・時刻の扱い

代表的なCPANモジュール

テキスト処理
データベース
Webアプリケーション
  • CGI - CGIプログラミング
  • Plack - PSGIのリファレンス実装
  • Mojolicious - Webフレームワーク
  • Catalyst - Webアプリケーションフレームワーク
Webアクセス
データ記述言語の処理

歴史

Perlのバージョン
Perl 1.0 1987年12月18日にリリース。6台のVAXと6台のSunのためのコンフィギュレーション管理制御システムのレポート作成ツールとして誕生した。
Perl 2.0 1988年6月05日にリリース。Henry Spencer作の美しい正規表現ライブラリをPerl風にアレンジし、導入した。
Perl 3.0 1989年10月18日にリリース。バイナリデータを処理できるようになった。
Perl 4.0 1991年3月21日にリリース。O'Reilly&Associates,Inc よりProgramming perlが発売されたのに合わせてリリースされた。
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年問題に対応した。
Perl 5.14.0 2011年5月14日にリリース。Unicode 6.0にほぼ完全に対応。IPv6サポートの改善。push, pop, unshift, shift, each, keys, valuesなどの配列やハッシュを受け取る関数が、リファレンスを受け取ることができるようになった。「package パッケージ名 { ... }」構文の追加。値を破壊せずに戻り値として返す正規表現オプション「r」が追加。
Perl 5.16.0 2012年5月20日にリリース。「use バージョン番号」文の動作が変更された。以前はスクリプトの実行に必要なPerlのバージョンを示すものだったが、「指定したバージョンよりも新しいバージョンのPerlで新たに実装された機能を無効化する」という動作になった。「__SUB__」は現在実行中のサブルーチンに対する参照を返す。featureプラグマで「unicode_eval」を有効にすると、文字列に対するevalは常に文字列をUnicodeとして扱う。また「evalbytes」を有効にすると、引数をバイト列として評価する「evalbytes」関数が利用できる。substrは、左辺値もしくは潜在的に左辺値とみられるコンテキストで2つもしくは3つの引数付きで呼び出された場合、第一引数を変更する特殊な左辺値スカラを返す。Unicode 6.1対応も強化されたほか、デバッガ、CORE名前空間、XSインターフェイスなどでさまざまな機能強化が加わっている。

エピソード

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

Perlの正式なリリースの前に、すでに「pearl」という名前のプログラミング言語が存在することに気づき、綴りを変更して「Perl」とした。このようにPerlは略語ではなく、もともと意味はないが、あとからいくつかの意味が考えられている。開発者ラリー自身によると、「practical extraction and report language」(実用的なデータ取得レポート作成言語)という意味を持ち、同時に 「pathologically eclectic rubbish lister」(病的折衷主義のガラクタ出力装置)[3]という少し皮肉な意味も込められている。

処理系

Perlという名称の記述においては、若干の注意が必要である。プログラミング言語としての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の姉妹言語としてPerl6が存在する。Perl6はParrotというバーチャルマシンの上で動作する。現在、ParrotCodeへのコンパイルを行うRakudo Starという処理系やHaskellで書かれたPugsという処理系などの複数の実装が公開されている。なおPerl6はPerlと互換性を持たない。

代表的なアプリケーション

脚注

  1. ^ perlsub - perldoc.perl.org” (英語). 2011年7月21日閲覧。 “WARNING: In general, you should be using my instead of local, because it's faster and safer.”
  2. ^ http://perldoc.perl.org/perlfork.html perlfork - Perl's fork() emulation
  3. ^ プログラミング Perl VOLUME 1 ISBN 4-87311-096-3

参考文献

関連項目

外部リンク

Template:Link GA Template:Link GA