Perl

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

言語処理系としてのperlは自由ソフトウェアである。Artistic LicenseおよびGPLのもとで配布されており、誰でもどちらかのライセンスを選択して利用することができる。UNIX、Windows、macOSやLinuxのようなUnix系オペレーティングシステム (OS) など多くのプラットフォーム上で動作する。

 特徴 
 強力な文字列処理の仕組みを備えており、正規表現を利用できる。
 連想配列（ハッシュ）をサポート。
 多次元データ構造が利用可能。
 自由度の高い文法。簡潔にプログラムを記述できる。
 後方互換性は高い。
 数多くのオペレーティングシステムで利用可能である。
 インタプリタであり、コードを利用者がコンパイルする仕組みはない。
 スクリプト言語の中では高い処理速度を持つ。
 Unicode使用を支援する仕組みがある。
 モジュールによる拡張が可能であり、有志によって開発された豊富なモジュールを利用できる（CPANを参照）。
 オブジェクト指向を支援する仕組みがある。
 リファレンスカウント方式によるガーベッジコレクションの仕組みがある。
 例外処理を利用できる。
 クロージャを利用できる。
 リフレクションを利用できる。

 Hello world 

print "Hello, world!\n" ;

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

 標準モジュール 

Perlには標準で利用できるモジュールが数多く存在する。一部を以下に挙げる。

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

 代表的なCPANモジュール 
 テキスト処理
 Text::CSV - CSVファイルの解析
 Text::Diff - diffコマンド
 Template Toolkit - テンプレートシステム

 データベース
 DBI - 汎用データベースインタフェース

 Webアプリケーション
 CGI - CGIプログラミング
 Plack - PSGIのリファレンス実装
 Mojolicious - Webフレームワーク
 Catalyst - Webアプリケーションフレームワーク

 Webアクセス
 LWP::UserAgent - WWWクライアント

 データ記述言語の処理
 XML::Simple - XMLをPerlのデータ構造に変換
 XML::LibXML - XMLのサポート
 JSON - JSONのサポート
 YAML - YAMLのサポート

 歴史 

+Perlの歴史内容1.0 1987年12月18日6台の  機と6台の  機のためのコンフィギュレーション管理制御システムのレポート作成ツールとして誕生した。2.01988年6月05日ヘンリー・スペンサー作の美しい正規表現ライブラリを  風にアレンジし、導入した。 3.01989年10月18日バイナリデータを処理できるようになった。4.01991年3月21日 より  が発売されたのに合わせて公開された。5.01994年10月17日レキシカル変数 my の導入
リファレンスおよびオブジェクト指向に対応。
useが導入され追加モジュールの取扱いが大幅に強化された。
strictプラグマの導入5.5.01998年7月22日正規表現の拡張、B::*モジュールによるフックのサポート、qr// 正規表現演算子の追加がなされた。
 を含む幅広いオペレーティングシステムに移植された。
日本語圏で最も重要なことは、このバージョンが  がサポートする最後のバージョンということである。したがって、日本語情報処理において2022年においてもなお、バージョン 5.005_03 は利用されている。5.6.02000年5月22日our文やウィークリファレンス、warningsプラグマの導入など、言語コアが大きく拡張された。
試験的ながら  のサポートを開始した最初のバージョン。
バージョン番号の構造を変更。サブバージョン（5.6.0の6に相当）が偶数のものが安定版、奇数のものが開発版を意味する。5.8.02002年7月18日5.8系列の最新版は5.8.9（2008年12月14日）。
汎用文字エンコーディング操作モジュール Encode が標準ライブラリに加えられ、および  などの様々な文字エンコーディングに正式に対応した。
スレッドやPerlIOレイヤが導入された。5.10.02007年12月18日公開日は  の公開からちょうど20年目にあたる。
静的変数を宣言する state 文や、文に相当する given 文、say などの言語拡張が導入された。
新しいキーワードの導入による互換性の問題に対処するため、新しいキーワードの導入を feature プラグマで制御できるようになった。5.12.02010年4月13日package のバージョン指定構文や未実装部分を表す...演算子（ヤダヤダ演算子）、後置の when 修飾子などが導入された。
日付と時刻に関するコアモジュールが2038年問題に対応した。5.14.02011年5月14日 6.0 にほぼ完全に対応。
IPv6サポートの改善。
push、pop、unshift、shift、each、keys、values などの配列やハッシュを受け取る関数が、リファレンスを受け取ることができるようになった。
package パッケージ名 { ... }構文の追加。
値を破壊せずに戻り値として返す正規表現オプションrが追加。5.16.02012年5月20日use バージョン番号文の動作が変更された。以前はスクリプトの実行に必要なPerlのバージョンを示すものだったが、「指定したバージョンよりも新しいバージョンの  で新たに実装された機能を無効化する」という動作になった。
__SUB__は現在実行中のサブルーチンに対する参照を返す。
feature プラグマでunicode_evalを有効にすると、文字列に対する eval は常に文字列を  として扱う。またevalbytesを有効にすると、引数をバイト列として評価するevalbytes関数が利用できる。
substr は、左辺値もしくは潜在的に左辺値とみられるコンテキストで2つもしくは3つの引数付きで呼び出された場合、第一引数を変更する特殊な左辺値スカラを返す。
 6.1 対応も強化された。
デバッガ、CORE名前空間、XSインターフェイスなどでさまざまな機能強化が加わっている。5.18.02013年5月18日実験的機能を利用するための新しい警告カテゴリexperimental::feature_nameが追加され、 5.10 で加わったスマートマッチ演算子、レキシカルな$_がそのカテゴリに変更された。
ハッシュの際に使われるシードがランダム化され、keys や values、each といったハッシュを利用する関数が返すキー／値の並び順が実行毎に異なるようになった。
 6.2 への対応、新しいDTraceプローブの追加、実験的機能としてレキシカルサブルーチンの追加などが行われた。\N{...}表現の扱いがいくつか変わっているほか、垂直タブがホワイトスペースとして扱われなくなっている点など、文字の扱いについていくつかの変更が加わった。
encoding、CPANPLUS、Log::Message、Log::Message::Config、Log::Message::Handlers、Log::Message::Item、Log::Message::Simple、Object::Accessorなどが廃止予定のモジュールとなった。5.20.02014年5月27日実験的機能としてuse feature 'signature'によるサブルーチンシグネチャ、use feature 'postderef'によるPostfix Dereferencingと呼ばれる機能が追加された。Postfix Dereferencingを利用すると、いままで${ $sref } のように表記していたものが$sref->$* のように表記できるようになる。
新たなスライス表記として、キーと値のペアを戻す%hash{…}と%array[…]というスライス表記が加わった。
subキーワードのprototype属性がサポートされ、プロトタイプパーシングの一貫性も強化された。
64ビットプラットフォーム対応が改善され、Perl配列が2**31以上の要素を保持できるようになった。
正規表現エンジンは2**31以上の文字列に対応できるようになった。
 6.3 に対応した。
コアモジュールとしてIO::Socket::IPが追加された。
rand関数の仕様が変更された。
一部のコマンドラインオプションの挙動が変更された。5.22.02015年6月1日ビット単位の演算子が導入された。
ダブルダイアモンド演算子が導入された。
正規表現の\bバウンダリの機能が強化された。
正規表現のキャプチャしない修飾子が追加された。
use re 'strict'がサポートされた。
Unicode 7.0がサポートされた。
POSIX 2008のロケール、通貨がサポートされた。
古いプラットフォーム上のUTF-8判定が改善された。
リファレンスのエイリアスがサポートされた。
引数なしのプロトタイプがサポートされた。
サブルーチンのconstアトリビュートがサポートされた。
filenoにディレクトリハンドルも指定可能になった。
Win32でリスト形式のパイプオープンが可能になった。
リスト代入の繰返し指定が可能になった。
InfとNanの扱いが強化された。
浮動小数点数の扱いが強化された。
InfとNaNの文字列化は致命的エラーになった。
実験的なCバックトレースAPIがサポートされた。5.24.02016年5月9日サブルーチンと数値計算が高速化された。
Unicode 8.0 がサポートされた。
実験的な扱いだった前方デリファレンスが本格サポートされた。5.26.02017年5月30日Unicode 9.0 がサポートされた。
セキュリティ対策として特殊変数 @INC は、デフォルトではカレントディレクトリ "." を含まなくなった。
実験的な扱いだったレキシカルサブルーチンが本格サポートされた。
インデントされたヒヤドキュメントがサポートされた。
新しい正規表現修飾子 /xx がサポートされた。
正規表現の特殊変数として @{^CAPTURE}、 %{^CAPTURE}、%{^CAPTURE_ALL} が追加された。
OS側で対応していれば、UTF-8 ロケールでデフォルトの照合を使えるようになった。5.28.02018年6月22日Unicode 10.0 がサポートされた。
delete 関数がキー/値のハッシュスライスに使えるようになった。
実験的機能として、正規表現アサートの英字名が利用可能になった。
実験的機能として、Unicode 用字の混合が検出できるようになった。
perl -i によるインプレース編集がより安全になった。
state 宣言された配列変数、ハッシュ変数が初期化できるようになった。
OSが扱うiノード番号をフルサイズで扱えるようになった。
sprintf 関数のフォーマットサイズ修飾子 %j は C99以前のコンパイラでも使用できるようになった。
Close-on-exec フラグはアトミックに設定されるようになった。
文字列および数値のビット演算子は実験的ではなくなった。
OSがロケールに対応している場合、スレッド環境でもロケールを自由に使用・変更できるようになった。
特殊変数 ${^SAFE_LOCALES} が追加された。
多数のセキュリティ上の修正が行われた。5.30.02019年5月22日Unicode 12.1をサポート。5.32.02020年6月20日演算子 isa をサポート。5.34.02021年5月20日 実験的機能としてuse feature 'try'によるtry/catch構文が追加された。
 正規表現の繰り返し構文 qr/{,n}/において下限の省略が可能になった。
 これまでは正規表現の中括弧の中にスペースを含むことができなかったが、\x{ FFFC }のようにスペースを含むことが可能になった。
 0odddddのような8進数表記が可能になった。5.36.02022年5月28日Unicode 14.0 に対応した。
use v5.36 の記述により Perl7 で提案されていた機能の大部分がサポートされた。
コマンドラインフラグ -g が導入された。
正規表現の拡張ブラケット文字クラスは実験的とは見なされなくなった。
正規表現の可変長の後読みは、ほとんど実験的とは見なされなくなった。
浮動小数点例外のシグナル SIGFPE が遅延しなくなった。
ブール値 true/false がサポートされた。
実験的機能として、for ループの1回の処理で複数の値を扱えるようになった。
実験的機能として、組み込み関数が追加された。
実験的機能として、defer ブロックがサポートされた。
実験的機能として、try/catch 構文に finally ブロックが利用できるようになった。
実験的機能として、Unicode による対になるデリミタが多数サポートされた。
サブルーチンシグネチャ付きのサブルーチンの @_ は実験的になった。5.38.02023年7月02日class構文が追加された。
Unicode 15.0 に対応した。
非推奨の警告には特定のサブカテゴリが追加された。
%{^HOOK} APIが導入された。
PERL_RAND_SEED
シグネチャでのDefined-orおよびlogical-or代入のデフォルト式がサポートされた。
@INCフックの強化と$INCおよびINCDIR
deferまたはfinallyブロックからの制御フローがコンパイル時に検出されるようになった。
パターン内での楽観的な評価
REG_INFが65,536から2,147,483,647に引き上げられた。
新しいAPI関数optimize_optreeおよびfinalize_optreeが追加された。
一部のgoto文がdeferおよびfinallyブロックで許可されるようになった。
新しい正規表現変数${^LAST_SUCCESSFUL_PATTERN}が追加された。
参加プラットフォームでLocaleカテゴリLC_NAMEがサポートされるようになった。5.40.02024年6月9日 定数式のコンパイル時畳み込みが拡張された。  
 新しい警告とエラーチェック機能が追加され、静的解析と実行時チェックが強化された。  
 マルチディスパッチのサポートが改善され、複数のシグネチャを持つ関数やメソッドの定義が容易になった。  
 JSON::PPやCPAN::Meta::YAMLなど、コアモジュールが最新バージョンにアップデートされた。  
 %{^HOOK} の強化により、フックの使用が柔軟になった。  
 Perlの内部構造が最適化され、特に大規模なデータ操作や複雑な正規表現のパフォーマンスが向上した。  
 新しいAPI関数optimize_optreeとfinalize_optreeが追加され、コンパイラの最適化が強化された。  
 正規表現関連でREG_INFの値が2,147,483,647まで引き上げられた。  
 Perlの一部プラットフォームで、LocaleカテゴリのLC_ADDRESSがサポートされた。  5.42.02025年7月3日 フィールド変数に新しく:writerアトリビュートが追加された。
 my methodによるレキシカルなメソッド宣言および->&によるレキシカルなメソッド呼び出しがサポートされた。
 実験的機能としてリスト処理演算子anyとallが追加された。
 新しくsource::encodingプラグマが追加された。
 排他的論理和代入演算子 ^^=が追加された。
 chdirがCORE::名前空間のサブルーチンに追加された。
 Unicode 16.0に対応した。
 switchとスマートマッチは将来に渡って機能が維持されることになった。
 グローバル名の区切り文字としてのアポストロフィは無効にできるようになった。

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

Perlの正式なリリースの前に、ラリーはすでに「PEARL」という名前のプログラミング言語が存在することに気づき、綴りを変更して「Perl」とした。このようにPerlという名前は何らかの略語ではないが、あとからいくつかのバクロニムが考えられている。開発者ラリー自身によると、「」（実用的なデータ取得レポート作成言語）という意味を持ち、同時に 「」（病的折衷主義のガラクタ出力装置）プログラミング Perl VOLUME 1 ISBN 4-87311-096-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の姉妹言語としてRaku (旧 Perl 6) が存在する。RakuはParrotという仮想マシンの上で動作する。現在、ParrotCodeへのコンパイルを行うRakudo Starという処理系やHaskellで書かれたPugsという処理系などの複数の実装が公開されている。なおRakuはPerlと互換性を持たない。

 Perlが利用されているアプリケーション 
Perlが利用されている代表的なウェブアプリケーションや管理ツール。

 Webアプリケーション 
Movable Type
TWiki
Bugzilla
cPanel

 Webサービス 
 DuckDuckGo

 管理ツール 
git
openssl
autoconf
automake
SpamAssassin
VmwareTools
MySQL innotop

 脚注 

 参考文献 
 ラリー・ウォール、ジョン・オーワント、トム・クリスチャンセン著、近藤嘉雪訳『プログラミング Perl』VOLUME 1 (ISBN 4-87311-096-3), 2 (ISBN 4-87311-097-1), オライリー・ジャパン、2002年

 関連項目 

 ラリー・ウォール
 Artistic License
 グルー言語
 スクリプト言語
 軽量プログラミング言語

 外部リンク 


 Perl programming documentation - Perlの公式ドキュメント
 perldoc.jp - Perlの公式ドキュメントの日本語訳
 CPAN - Perlのモジュールの配布を行うサイト
 Perl.com - オライリーによるPerlのウェブサイト
 ActivePerl - ActiveState社のPerlディストリビューション。Win32版はWindows環境で最も利用される。
 Chocolate Perl - Perlのディストリビューションのひとつ
 Strawberry Perl - Perlのディストリビューションのひとつ
 PSGI/Plack - WSGIのPerlによる実装
 Japan Perl Association - YAPC::Asiaを主催する一般社団法人

Perl
Perl
*
Category:1987年のソフトウェア
Category:Artistic Licenseを利用するソフトウェア
Category:Cでプログラムされた自由ソフトウェア