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

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

## 特徴

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

## モジュール

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プラグマ

## 歴史

Perlの歴史

| バージョン | 公開日 | 内容 |
| --- | --- | --- |
| 1.0 | 1987年12月18日 | - 6台の VAX 機と6台の Sun 機のためのコンフィギュレーション管理制御システムのレポート作成ツールとして誕生した。 |
| 2.0 | 1988年6月05日 | - ヘンリー・スペンサー作の美しい正規表現ライブラリを Perl 風にアレンジし、導入した。 |
| 3.0 | 1989年10月18日 | - バイナリデータを処理できるようになった。 |
| 4.0 | 1991年3月21日 | - O'Reilly&Associates, Inc. より Programming perl が発売されたのに合わせて公開された。 |
| 5.0 | 1994年10月17日 | - レキシカル変数 my の導入 - リファレンスおよびオブジェクト指向に対応。 - `use`が導入され追加モジュールの取扱いが大幅に強化された。 - strictプラグマの導入 |
| 5.5.0 | 1998年7月22日 | - 正規表現の拡張、`B::*`モジュールによるフックのサポート、`qr//` 正規表現演算子の追加がなされた。 - BeOS を含む幅広いオペレーティングシステムに移植された。 - 日本語圏で最も重要なことは、このバージョンが JPerl がサポートする最後のバージョンということである。したがって、日本語情報処理において2022年においてもなお、バージョン 5.005\_03 は利用されている。 |
| 5.6.0 | 2000年5月22日 | - `our`文やウィークリファレンス、`warnings`プラグマの導入など、言語コアが大きく拡張された。 - 試験的ながら Unicode のサポートを開始した最初のバージョン。 - バージョン番号の構造を変更。サブバージョン(5.6.0の6に相当)が偶数のものが安定版、奇数のものが開発版を意味する。 |
| 5.8.0 | 2002年7月18日 | - 5.8系列の最新版は5.8.9(2008年12月14日)。 - 汎用文字エンコーディング操作モジュール `Encode` が標準ライブラリに加えられ、Unicodeおよび Shift\_JIS などの様々な文字エンコーディングに正式に対応した。 - スレッドや`PerlIO`レイヤが導入された。 |
| 5.10.0 | 2007年12月18日 | - 公開日は Perl 1.0 の公開からちょうど20年目にあたる。 - 静的変数を宣言する `state` 文や、switch文に相当する `given` 文、`say` などの言語拡張が導入された。 - 新しいキーワードの導入による互換性の問題に対処するため、新しいキーワードの導入を `feature` プラグマで制御できるようになった。 |
| 5.12.0 | 2010年4月13日 | - `package` のバージョン指定構文や未実装部分を表す`...`演算子(ヤダヤダ演算子)、後置の `when` 修飾子などが導入された。 - 日付と時刻に関するコアモジュールが2038年問題に対応した。 |
| 5.14.0 | 2011年5月14日 | - Unicode 6.0 にほぼ完全に対応。 - IPv6サポートの改善。 - `push`、`pop`、`unshift`、`shift`、`each`、`keys`、`values` などの配列やハッシュを受け取る関数が、リファレンスを受け取ることができるようになった。 - `package パッケージ名 { ... }`構文の追加。 - 値を破壊せずに戻り値として返す正規表現オプション`r`が追加。 |
| 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`インターフェイスなどでさまざまな機能強化が加わっている。 |
| 5.18.0 | 2013年5月18日 | - 実験的機能を利用するための新しい警告カテゴリ`experimental::feature_name`が追加され、Perl 5.10 で加わったスマートマッチ演算子、レキシカルな`$_`がそのカテゴリに変更された。 - ハッシュの際に使われるシードがランダム化され、`keys` や `values`、`each` といったハッシュを利用する関数が返すキー/値の並び順が実行毎に異なるようになった。 - Unicode 6.2 への対応、新しい`DTrace`プローブの追加、実験的機能としてレキシカルサブルーチンの追加などが行われた。`\N{...}`表現の扱いがいくつか変わっているほか、垂直タブがホワイトスペースとして扱われなくなっている点など、文字の扱いについていくつかの変更が加わった。 - `encoding`、`CPANPLUS`、`Log::Message`、`Log::Message::Config`、`Log::Message::Handlers`、`Log::Message::Item`、`Log::Message::Simple`、`Object::Accessor`などが廃止予定のモジュールとなった。 |
| 5.20.0 | 2014年5月27日 | - 実験的機能として`use feature 'signature'`によるサブルーチンシグネチャ、`use feature 'postderef'`によるPostfix Dereferencingと呼ばれる機能が追加された。Postfix Dereferencingを利用すると、いままで`${ $sref }` のように表記していたものが`$sref->$*` のように表記できるようになる。 - 新たなスライス表記として、キーと値のペアを戻す`%hash{...}`と`%array[...]`というスライス表記が加わった。 - subキーワードのprototype属性がサポートされ、プロトタイプパーシングの一貫性も強化された。 - 64ビットプラットフォーム対応が改善され、Perl配列が2\*\*31以上の要素を保持できるようになった。 - 正規表現エンジンは2\*\*31以上の文字列に対応できるようになった。 - Unicode 6.3 に対応した。 - コアモジュールとして`IO::Socket::IP`が追加された。 - rand関数の仕様が変更された。 - 一部のコマンドラインオプションの挙動が変更された。 |
| 5.22.0 | 2015年6月1日 | - ビット単位の演算子が導入された。 - ダブルダイアモンド演算子が導入された。 - 正規表現の`\b`バウンダリの機能が強化された。 - 正規表現のキャプチャしない修飾子が追加された。 - `use re 'strict'`がサポートされた。 - Unicode 7.0がサポートされた。 - POSIX 2008のロケール、通貨がサポートされた。 - 古いプラットフォーム上のUTF-8判定が改善された。 - リファレンスのエイリアスがサポートされた。 - 引数なしのプロトタイプがサポートされた。 - サブルーチンの`const`アトリビュートがサポートされた。 - `fileno`にディレクトリハンドルも指定可能になった。 - Win32でリスト形式のパイプオープンが可能になった。 - リスト代入の繰返し指定が可能になった。 - `Inf`と`Nan`の扱いが強化された。 - 浮動小数点数の扱いが強化された。 - `Inf`と`NaN`の文字列化は致命的エラーになった。 - 実験的なCバックトレースAPIがサポートされた。 |
| 5.24.0 | 2016年5月9日 | - サブルーチンと数値計算が高速化された。 - Unicode 8.0 がサポートされた。 - 実験的な扱いだった前方デリファレンスが本格サポートされた。 |
| 5.26.0 | 2017年5月30日 | - Unicode 9.0 がサポートされた。 - セキュリティ対策として特殊変数 @INC は、デフォルトではカレントディレクトリ "." を含まなくなった。 - 実験的な扱いだったレキシカルサブルーチンが本格サポートされた。 - インデントされたヒヤドキュメントがサポートされた。 - 新しい正規表現修飾子 /xx がサポートされた。 - 正規表現の特殊変数として @{^CAPTURE}、 %{^CAPTURE}、%{^CAPTURE_ALL} が追加された。 - OS側で対応していれば、UTF-8 ロケールでデフォルトの照合を使えるようになった。 |
| 5.28.0 | 2018年6月22日 | - Unicode 10.0 がサポートされた。 - delete 関数がキー/値のハッシュスライスに使えるようになった。 - 実験的機能として、正規表現アサートの英字名が利用可能になった。 - 実験的機能として、Unicode 用字の混合が検出できるようになった。 - perl -i によるインプレース編集がより安全になった。 - state 宣言された配列変数、ハッシュ変数が初期化できるようになった。 - OSが扱うiノード番号をフルサイズで扱えるようになった。 - sprintf 関数のフォーマットサイズ修飾子 %j は C99以前のコンパイラでも使用できるようになった。 - Close-on-exec フラグはアトミックに設定されるようになった。 - 文字列および数値のビット演算子は実験的ではなくなった。 - OSがロケールに対応している場合、スレッド環境でもロケールを自由に使用・変更できるようになった。 - 特殊変数 ${^SAFE\_LOCALES} が追加された。 - 多数のセキュリティ上の修正が行われた。 |
| 5.30.0 | 2019年5月22日 | - Unicode 12.1をサポート。 |
| 5.32.0 | 2020年6月20日 | - 演算子 isa をサポート。 |
| 5.34.0 | 2021年5月20日 | - 実験的機能として`use feature 'try'`によるtry/catch構文が追加された。 - 正規表現の繰り返し構文 `qr/{,n}/`において下限の省略が可能になった。 - これまでは正規表現の中括弧の中にスペースを含むことができなかったが、`\x{ FFFC }`のようにスペースを含むことが可能になった。 - `0oddddd`のような8進数表記が可能になった。 |
| 5.36.0 | 2022年5月28日 | - Unicode 14.0 に対応した。 - use v5.36 の記述により Perl7 で提案されていた機能の大部分がサポートされた。 - コマンドラインフラグ -g が導入された。 - 正規表現の拡張ブラケット文字クラスは実験的とは見なされなくなった。 - 正規表現の可変長の後読みは、ほとんど実験的とは見なされなくなった。 - 浮動小数点例外のシグナル SIGFPE が遅延しなくなった。 - ブール値 true/false がサポートされた。 - 実験的機能として、for ループの1回の処理で複数の値を扱えるようになった。 - 実験的機能として、組み込み関数が追加された。 - 実験的機能として、defer ブロックがサポートされた。 - 実験的機能として、try/catch 構文に finally ブロックが利用できるようになった。 - 実験的機能として、Unicode による対になるデリミタが多数サポートされた。 - サブルーチンシグネチャ付きのサブルーチンの @\_ は実験的になった。 |
| 5.38.0 | 2023年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.0 | 2024年6月9日 | - 定数式のコンパイル時畳み込みが拡張された。 - 新しい警告とエラーチェック機能が追加され、静的解析と実行時チェックが強化された。 - マルチディスパッチのサポートが改善され、複数のシグネチャを持つ関数やメソッドの定義が容易になった。 - `JSON::PP`や`CPAN::Meta::YAML`など、コアモジュールが最新バージョンにアップデートされた。 - `%{^HOOK}` の強化により、フックの使用が柔軟になった。 - Perlの内部構造が最適化され、特に大規模なデータ操作や複雑な正規表現のパフォーマンスが向上した。 - 新しいAPI関数`optimize_optree`と`finalize_optree`が追加され、コンパイラの最適化が強化された。 - 正規表現関連で`REG_INF`の値が2,147,483,647まで引き上げられた。 - Perlの一部プラットフォームで、`Locale`カテゴリの`LC_ADDRESS`がサポートされた。 |

## エピソード

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

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

## 処理系

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 アプリケーションや管理ツール。

### Webアプリケーション

- Movable Type
- TWiki
- Bugzilla
- cPanel

### Webサービス

- DuckDuckGo

### 管理ツール

- git
- openssl
- autoconf
- automake
- SpamAssassin
- VmwareTools
- MySQL innotop