Perlとは?

辞典・百科事典の検索サービス - Weblio辞書

初めての方へ

参加元一覧


用語解説|製品情報|動画|文献|商品|全文検索

三省堂 大辞林

三省堂三省堂

Perl (パール) [Pathological Eclectic Rubbish Lister]

プログラム言語の一。テキスト-ファイルプロセスを簡単に取り扱うことができる。1986年ウォール(L.Wall)が開発


OSS用語集

OSS iPediaOSS iPedia

Perl

読み方パール

Perl Foundation中心となって開発されているオープンソーススクリプト言語Artistic LicenseGPLデュアルライセンスによって配布されている。
1987年からの長い歴史を持つプログラミング言語で、正規表現扱いが容易など、テキスト処理を得意とする。もともとは純粋な手続き型言語だったが、バージョンアップの際にオブジェクト指向機能追加され、オブジェクト指向プログラミングも可能となった。インターネット普及期には、動的Webページ生成するためのCGI記述する言語として、非常によく使われていた。
データベースアクセスするためのDBIなど、モジュール組み込むことにより、さまざまな機能付加することができる。
関連見出し
Artistic License
GPL
関連URL
The Perl Directory(http://www.perl.org/)


IT用語辞典バイナリ

IT用語辞典バイナリIT用語辞典バイナリ

Perl

フルスペル:Practical Extraction and Report Language
読み方:ぱーる

Perlとは、ラリー・ウォールによって開発されたインタプリタ方式プログラミング言語とその処理系の名称である。今日、Perlは世界で最も普及したプログラミング言語一つであり、CPANには多数のPerlモジュールライブラリが登録されている。また、実行時にランタイムコンパイルしてから実行される仕組みとなっており、厳密にインタプリタ型の言語ではない側面も持つ。


参照リンク
www.perl.org - 英語サイト
プログラミングのほかの用語一覧
スクリプト言語:  モバイルコード  Open Ajax  PHP  Perl  Python  Ruby  Ruby on Rails


ウィキペディア

ウィキペディアウィキペディア

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/
Wikibooks logo Perl - ウィキブックス
テンプレートを表示

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

言語処理系としての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;
}

飛び越し

飛び越しを行うには「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    = \&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 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やLinuxforkに近い。iThreads(インタープリタスレッド)と呼ばれており、他のシステムにおけるどのスレッドとも実装は異なる。シグナルと同時に利用することで問題があるとも言われている。もともとWindows版にてforkのような実装を行うためのコードだったものから、発展している。[2]多くのLinuxディストリビューションではiThreadsをオンにして配布しているが、安全性重視をうたっているFreeBSDOpenBSDの標準ディストリビューションや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モジュール

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

PSGI/Plack

Perlスクリプトは実行ファイル形式またはモジュール形式を用いてウェブアプリケーションとして実行することができる。実行ファイル形式はCGI、FastCGISpeedyCGI、モジュール形式は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



  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. ^ http://gihyo.jp/news/report/01/yapcasia2009/0001 YAPC::Asia Tokyo 2009 スペシャルレポート
  4. ^ プログラミング Perl VOLUME 1 ISBN 4-87311-096-3


「Perl」の続きの解説一覧




固有名詞の分類



Perlに関係した商品


Perlのページへのリンク

[PR] おすすめ情報

「Perl」の関連用語
Perlのお隣キーワード
モバイル
モバイル版のWeblioは、下記のURLからアクセスしてください。
http://m.weblio.jp/
» モバイルで「Perl」を見る
_ _   


Perlのページの著作権
Weblio 辞書情報提供元は参加元一覧にて確認できます。

  
三省堂三省堂
Copyright (C) 2001-2012 Sanseido Co.,Ltd. All rights reserved.
株式会社 三省堂三省堂 Web Dictionary
OSS iPediaOSS iPedia
Copyright © Information-technology Promotion Agency, Japan. All rights reserved 2006-2012
IT用語辞典バイナリIT用語辞典バイナリ
Copyright © 2005-2012 Weblio 辞書 IT用語辞典バイナリさくいん。 この記事は、IT用語辞典バイナリPerlの記事を利用しております。
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのPerl (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2012 Weblio RSS