三省堂 大辞林 |
Perl (パール) [Pathological Eclectic Rubbish Lister]
OSS用語集 |
Perl
Perl Foundationが中心となって開発されているオープンソースのスクリプト言語。Artistic LicenseとGPLのデュアルライセンスによって配布されている。
1987年からの長い歴史を持つプログラミング言語で、正規表現の扱いが容易など、テキスト処理を得意とする。もともとは純粋な手続き型言語だったが、バージョンアップの際にオブジェクト指向機能が追加され、オブジェクト指向プログラミングも可能となった。インターネット普及期には、動的にWebページを生成するためのCGIを記述する言語として、非常によく使われていた。
データベースにアクセスするためのDBIなど、モジュールを組み込むことにより、さまざまな機能を付加することができる。
関連見出し
Artistic License
GPL
関連URL
The Perl Directory(http://www.perl.org/)
IT用語辞典バイナリ |
Perl
読み方:ぱーる
Perlとは、ラリー・ウォールによって開発されたインタプリタ方式のプログラミング言語とその処理系の名称である。今日、Perlは世界で最も普及したプログラミング言語の一つであり、CPANには多数のPerlモジュールやライブラリが登録されている。また、実行時にランタイムコンパイルしてから実行される仕組みとなっており、厳密にはインタプリタ型の言語ではない側面も持つ。
参照リンク
www.perl.org - 英語サイト
ウィキペディア |
Perl
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2011/09/29 15:31 UTC 版)
| Perl | |
|---|---|
| パラダイム | マルチパラダイム |
| 登場時期 | 1987年 |
| 最新リリース | 5.14.2 / 2011年9月26日 |
| 型付け | 動的型付け |
| 影響を受けた言語 | AWK, BASIC-PLUS, C, C++, Lisp, Pascal, Python, sed, シェルスクリプト |
| 影響を与えた言語 | JavaScript, PHP, Ruby, PowerShell |
| プラットフォーム | クロスプラットフォーム |
| ライセンス | GNU General Public License, Artistic License |
| ウェブサイト | http://www.perl.org/ |
Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、Cやsed、awk、シェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。Webアプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションはMovable TypeやSpamAssassinなど。
言語処理系としてのperlはフリーソフトウェアである。Artistic LicenseおよびGPLのもとで配布されており、誰でもどちらかのライセンスを選択して利用することができる。UNIXやWindowsなど多くのプラットフォーム上で動作する。
目次 |
特徴
- 強力な文字列処理。正規表現をサポート
- 連想配列(ハッシュ)をサポート
- 多次元データ構造が利用可能
- 自由度の高い文法。簡潔にプログラムを記述できる
- 高い後方互換性を持つ
- 数多くのオペレーティングシステムで利用可能
- プログラムの実行には事前コンパイルは不要
- スクリプト言語の中では高い処理速度を持つ
- Unicodeのサポート
- モジュールによる拡張が可能
- 有志によって開発された豊富なモジュール(CPANを参照)
- オブジェクト指向プログラミングのサポート
- リファレンスカウント方式によるガーベッジコレクション
- 例外処理のサポート
- クロージャのサポート
- リフレクションのサポート
Hello world
print "Hello, world!\n";
文法
コメント
「#」以降は行末までがコメントである。
# ここはコメントです。
変数
変数としてスカラ、配列、ハッシュがある。変数名の前にシジル (sigil) と呼ばれる記号でこれらの変数を区別する。スカラのシジルは「$」、配列は「@」、ハッシュは「%」となっている。
変数は初期化の仕方によって、スコープが異なったものになる。
- 変数宣言をせずに初期化された変数 → 大域変数
local宣言をしてから初期化された変数 → 動的スコープで、ブロック内でのみ有効な局所変数my宣言をしてから初期化された変数 → 静的スコープで、ブロック内でのみ有効な局所変数
より高速で安全な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; }
飛び越し
飛び越しを行うには「goto」を利用する。goto の後ろには飛び越し先ブロックのラベルを書く。goto を使わずに、while/last/redo などの繰り返し機構を使ってプログラムを書いたほうが、プログラムコードが読みやすくなる場合もある。
goto destination ; print "この print 文は実行されない。\n" ; destination: { print "飛び越し先ブロック\n" ; }
サブルーチン
サブルーチンは以下のように定義する。
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 = \⊂ # サブルーチンへのリファレンス 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 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!"'
その他の文法
PODによる記法を用いると複数行コメントを書くことができる。(あまり利用されない)
=begin comment
ここは
コメント
です。
=end comment
その他の特徴
- スレッド
- Perlのスレッドはデータが丸ごとコピーされるという点で概念的にUNIXやLinuxのforkに近い。iThreads(インタープリタスレッド)と呼ばれており、他のシステムにおけるどのスレッドとも実装は異なる。シグナルと同時に利用することで問題があるとも言われている。もともとWindows版にてforkのような実装を行うためのコードだったものから、発展している。[2]多くのLinuxディストリビューションではiThreadsをオンにして配布しているが、安全性重視をうたっているFreeBSDやOpenBSDの標準ディストリビューションやOpenSolarisでは、iThreadsをオフにしている。
- PerlIOレイヤ
- 入出力操作に手を加えることができる。各レイヤはC言語で実装できるため高速である。
モジュール
Perlプログラムには、モジュールによって機能を付加することができる。たとえば、他のプログラムやネットワークとの通信、各種ファイル形式の取り扱い、数学的な計算など、数多くのモジュールが存在する。PerlにはCPANというモジュールを体系的に管理するインターネット上のシステムがある。インターネットに接続しているならば、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モジュール
- テキスト処理
-
- Text::CSV - CSVファイルの解析
- Text::Diff - diffコマンド
- Template Toolkit - テンプレートシステム
- データベース
- Webアプリケーション
-
- CGI - CGIプログラミング
- Plack - PSGIのリファレンス実装
- Mojolicious - Webフレームワーク
- Catalyst - Webアプリケーションフレームワーク
- Webアクセス
-
- LWP::UserAgent - WWWクライアント
- データ記述言語の処理
-
- XML::Simple - XMLをPerlのデータ構造に変換
- XML::LibXML - XMLのサポート
- JSON - JSONのサポート
- YAML - YAMLのサポート
PSGI/Plack
Perlスクリプトは実行ファイル形式またはモジュール形式を用いてウェブアプリケーションとして実行することができる。実行ファイル形式はCGI、FastCGI、SpeedyCGI、モジュール形式はmod_perl、ISAPIなどがある。このうちCGIが主な実行方法として知られているが、実行のたびにプロセスの読込・破棄を行っているため、オーバーヘッドが大きい。そのため、多くのアクセスを処理しなければならないウェブアプリケーションでは、パフォーマンスが悪くなることがある。一方、FastCGI、SpeedyCGI、mod_perlなどの環境では、プロセスをメモリ上に永続的に置くことによりプロセスの読込・破棄の作業を省き、高速化を図っている。
上記の実行環境はそれぞれインターフェイスが異なるため、ウェブアプリケーションフレームワークごとに差異を吸収するコードが繰り返し再発明されていた。この問題を解決すべく、宮川達彦氏主導の元、WSGIやRackにインスパイアされたPSGIというウェブアプリケーション フレームワーク用の規格が打ち出された[3]。また、同時に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
|
|||||||||||||||||
|
||||||||||||||||||||||||||||||||
- ^ “perlsub - perldoc.perl.org” (英語). 2011年7月21日閲覧。 “WARNING: In general, you should be using
myinstead oflocal, because it's faster and safer.” - ^ http://perldoc.perl.org/perlfork.html perlfork - Perl's fork() emulation
- ^ http://gihyo.jp/news/report/01/yapcasia2009/0001 YAPC::Asia Tokyo 2009 スペシャルレポート
- ^ プログラミング Perl VOLUME 1 ISBN 4-87311-096-3
固有名詞の分類
Perlに関係した商品
- 【送料無料】モダンPerl入門楽天ブックス
- 【送料無料】新Perlの国へようこそ楽天ブックス
- 【送料無料】プログラミングPerl(2(volume 2))第3版楽天ブックス