Perl は、高水準で汎用的なインタプリタ型の動的プログラミング言語です。Perl は公式には頭字語ではありませんが、[ 8 ] 「Practical Extraction and Reporting Language」など、さまざまな逆頭字語が使用されています。[ 9 ]
Perl は、レポート処理を容易にするための汎用Unixスクリプト言語として、1987 年にLarry Wallによって開発されました。 [ 10 ] [ 11 ]それ以来、多くの変更と改訂が行われてきました。Perl は当初は小文字でしたが、Perl 4 がリリースされる頃には大文字に変更されました。[ 11 ]最新のリリースは Perl 5 で、1994 年に初めてリリースされました。2000 年から 2019 年 10 月まで、Perl の第 6 バージョンが開発されていました。第 6 バージョンの名前はRakuに変更されました。[ 12 ] [ 13 ]両方の言語は、互いにアイデアを自由に借用する異なる開発チームによって独立して開発され続けています。
Perl は、 C、sh、AWK、sedなどの他のプログラミング言語から機能を借用しています。[ 1 ]多くの現代のUnix コマンドラインツールの恣意的なデータ長制限なしにテキスト処理機能を提供します。[ 14 ] Perl は非常に表現力豊かなプログラミング言語です。特定のアルゴリズムのソースコードは短く、非常に圧縮可能です。[ 15 ] [ 16 ]
Perl は、強力な正規表現と文字列解析機能のおかげで、1990 年代半ばにCGI スクリプト言語として広く普及しました。 [ 17 ] [ 18 ] [ 19 ] [ 20 ] CGI に加えて、Perl 5 はシステム管理、ネットワーク プログラミング、金融、バイオ インフォマティクス、およびグラフィカル ユーザー インターフェイス(GUI)などの他のアプリケーションにも使用されています。その柔軟性と強力さから、「スクリプト言語のスイス アーミー チェーンソー」というニックネームが付けられています。[ 21 ] 1998 年に、接着剤言語として広く使用されていることと、洗練されていないと認識されていることの両方を指して、 「インターネットをつなぎ止めるダクト テープ」とも呼ばれました。[ 22 ]

Perl は元々「Pearl」という名前でした。Wall は、言語に肯定的な意味合いを持つ短い名前を付けたいと考えていました。[ 23 ]しかし、Wall は Perl の正式リリース前に既存のPEARL言語を発見し、名前から「a」を削除しました。[ 24 ]
この名前は時折、バクロニムとして拡張されることがある。Practical Extraction and Report Language [ 25 ]や、Wall 自身のPathologically Eclectic Rubbish Listerなどである。後者はperl のマニュアルページに記載されている。[ 26 ]
O'Reilly Mediaが出版したProgramming Perl は、表紙にヒトコブラクダの写真が掲載されており、一般的に「ラクダの本」と呼ばれています。 [ 27 ]この画像は Perl の非公式シンボルとなっています。O'Reilly は商標としてこの画像を所有していますが、非商用利用の場合は、謝辞と www.perl.com へのリンクのみを条件としてライセンスを付与しています。商用利用のライセンスはケースバイケースで決定されます。[ 28 ] O'Reilly はまた、非商用サイト向けに「Programming Republic of Perl」のロゴを、Perl を使用するすべてのサイト向けに「Powered by Perl」ボタンを提供しています。[ 28 ]
Perl Foundation は、代替シンボルであるタマネギを所有しており、それを子会社の Perl Mongers、PerlMonks、Perl.org などにライセンス供与しています。[ 29 ]このシンボルは、真珠のタマネギを視覚的にもじったものです。[ 30 ]
2024年、少数の開発者グループによって、この言語の新しいラクダのロゴがクリエイティブ・コモンズ・ライセンスの下で公開されました[ 31 ]。公式のロゴではありませんが、言語とコミュニティの両方を象徴することを意図しており、O'Reillyの本からPerlとラクダの長年の関連性に基づいています。
ラリー・ウォールは、 Unisysでプログラマーとして働いていた1987年にPerlの開発に着手し、[ 14 ] 1987年12月18日にバージョン1.0をリリースした。[ 1 ]ウォールは初期のPerlを、テキスト操作に使用されていた既存の言語のいくつかのメソッドに基づいて開発した。
1988年6月にリリースされたPerl 2 [ 32 ] [ 33 ]は、より優れた正規表現エンジンを搭載していた。1989年10月にリリースされたPerl 3 [ 32 ]は、バイナリデータストリームのサポートを追加した[ 34 ] 。
当初、Perl のドキュメントは、1 つの長いman ページのみでした。1991 年に、表紙がラクダの形をしていることから多くの Perl プログラマーに「ラクダの本」として知られるProgramming Perlが出版され、この言語の事実上のリファレンスとなりました。 [ 35 ]同時に、Perl のバージョン番号は 4 に引き上げられましたが、これは言語に大きな変更があったことを示すためではなく、この本で十分にドキュメント化されたバージョンを識別するためでした。[ 36 ] Perl 4 は 1991 年 3 月にリリースされました。[ 32 ]
Perl 4 は一連のメンテナンス リリースを経て、1993 年に Perl 4.036 で最高潮に達し、その後 Wall は Perl 4 を放棄して Perl 5 の開発に着手しました。Perl 5 の初期設計は 1994 年まで続きました。perl5 -portersメーリング リストは、Perl 5 をさまざまなプラットフォームに移植する作業を調整するために 1994 年 5 月に設立されました。これは、Perl 5 の開発、メンテナンス、移植のための主要なフォーラムであり続けています。[ 37 ]
Perl 5.000 は 1994 年 10 月 17 日にリリースされました。[ 38 ]これはインタプリタのほぼ完全な書き直しであり、オブジェクト、参照、レキシカル (my) 変数、モジュールなど、言語に多くの新機能が追加されました。重要なのは、モジュールによってインタプリタを変更せずに言語を拡張するメカニズムが提供されたことです。これにより、コア インタプリタが安定すると同時に、通常の Perl プログラマーが新しい言語機能を追加できるようになりました。Perl 5 はそれ以来、活発に開発されています。
Perl 5.001 は 1995 年 3 月 13 日にリリースされました。Perl 5.002 は、新しいプロトタイプ機能とともに 1996 年 2 月 29 日にリリースされました。これにより、モジュール作成者はPerl の組み込み関数のように動作するサブルーチンを作成できるようになりました。Perl 5.003 は、セキュリティ リリースとして 1996 年 6 月 25 日にリリースされました。[ 39 ]
Perl 5 の歴史において最も重要な出来事の 1 つは、言語自体とは関係なく、モジュール サポートの結果として起こりました。1995 年 10 月 26 日、Perl 言語とPerl モジュールのリポジトリとしてComprehensive Perl Archive Network (CPAN) が設立されました。2022年 12 月現在211,850を超えるモジュールが43,865のディストリビューションに含まれており、14,324人以上の著者によって作成され、世界中の245以上の場所にミラーリングされています。[ 40 ]
Perl 5.004 は 1997 年 5 月 15 日にリリースされ、とりわけ UNIVERSAL パッケージが含まれていました。これにより Perl はすべてのクラスが自動的に派生する基本オブジェクトと、モジュールのバージョンを要求する機能を持つようになりました。もう 1 つの重要な開発はCGI.pmモジュールの組み込みでした[ 41 ]。これは Perl がCGI スクリプト言語として人気を博すのに貢献しました[ 42 ] 。
Perl 5.004 では、Microsoft Windows、Plan 9、QNX、およびAmigaOSのサポートが追加されました。[ 41 ]
Perl 5.005 は 1998 年 7 月 22 日にリリースされました。このリリースには、正規表現エンジンのいくつかの強化、モジュールを介したバックエンドへの新しいフックB::*、qr//正規表現の引用演算子、その他多数の新しいコアモジュール、BeOSを含むいくつかのオペレーティングシステムのサポートの追加が含まれていました。[ 43 ]
Perl 5.6 は 2000 年 3 月 22 日にリリースされました。主な変更点としては、64 ビットのサポート、Unicode文字列表現、2 GiB を超えるファイルのサポート、および「our」キーワードなどがありました。[ 45 ] [ 46 ] Perl 5.6 の開発中に、バージョン管理スキームを他のオープンソースプロジェクトにより近いものに変更することが決定されました。5.005_63 の後、次のバージョンは 5.5.640 となり、開発バージョンには奇数、安定版には偶数が割り当てられる予定です。[ 47 ]
2000年、ウォールはコミュニティからPerlの新バージョンに関する提案を募った。このプロセスにより、Perl 6の開発を導くために使用される361のRFC( Request for Comments )文書が作成された。2001年、 [ 48 ]は、変更要求を要約し、次世代Perlの設計を提示することを目的とした一連の文書であるPerl 6の「アポカリプス」の作成に着手した。これらは正式な文書ではなく、RFCの要約として提示された。この時点では、Perl 6は言語の説明としてのみ存在していた。
Perl 5.8 は 2002 年 7 月 18 日に初めてリリースされ、それ以降、5.X バージョンのリリースがほぼ毎年行われています。Perl 5.8 では、Unicode サポートの改善、新しい I/O 実装の追加、新しいスレッド実装の追加、数値精度の向上、およびいくつかの新しいモジュールの追加が行われました。[ 49 ] 2013 年時点では、このバージョンは依然として最も人気のある Perl バージョンであり、Red Hat Linux 5、SUSE Linux 10、Solaris 10、HP-UX 11.31、およびAIX 5 で使用されていました。
2004年に「概要」の作成作業が開始されました。これは元々黙示録を要約した文書でしたが、後にPerl 6言語の仕様となりました。2005年2月、オードリー・タンはHaskellで書かれたPerl 6インタープリタであるPugsの作成に着手しました。[ 50 ]これはPerl 6を実現するための最初の組織的な取り組みでした。この取り組みは2006年に停滞しました。[ 51 ]
Perl On New Internal Engine (PONIE) プロジェクトは 2003 年から 2006 年まで存在しました。これは Perl 5 と 6 の間の橋渡しとなり、Perl 5 インタープリタを Perl 6 Parrot 仮想マシン上で動作するように書き直す取り組みでした。目標は、世界中の何千もの企業にある何百万行もの Perl 5 コードの将来を確保することでした。[ 52 ] PONIE プロジェクトは 2006 年に終了し、現在は積極的に開発されていません。PONIE の一環として Perl 5 インタープリタに加えられた改良の一部は、このプロジェクトに統合されました。[ 53 ]
Perl 1.0 の 20 周年にあたる 2007 年 12 月 18 日に Perl 5.10.0 がリリースされました。Perl 5.10.0 には Perl 6 に近づく注目すべき新機能が含まれていました。これにはswitch 文(「given」/「when」と呼ばれる)、正規表現の更新、スマートマッチ演算子(~~) などがありました。[ 54 ] [ 55 ] ほぼ同時期に、Parrot 仮想マシンと並行して開発されたRakudo Perl として知られる Perl 6 の別の実装の開発が本格的に始まりました。2009 年 11 月現在、Rakudo Perl は毎月定期的にリリースされており、現在では Perl 6 の最も完全な実装となっています。
Perl 5 の開発プロセスにおいて、Perl 5.11 で大きな変更がありました。開発コミュニティは、開発版リリースを月1回、安定版リリースを年1回というサイクルに移行しました。この計画に基づき、バグ修正版リリースは安定版リリースの後に3か月ごとにリリースされることになります。
2010 年 4 月 12 日に Perl 5.12.0 がリリースされました。注目すべきコア機能強化には、新しいpackage NAME VERSION構文、ヤダヤダ演算子(まだ実装されていないプレースホルダーコードをマークすることを意図しています)、暗黙の制約、完全なY2038準拠、正規表現変換オーバーロード、DTraceサポート、およびUnicode 5.2 が含まれます。[ 56 ]
2011年5月14日、JSONサポートを組み込んだPerl 5.14がリリースされた。[ 57 ]
2012年5月20日、Perl 5.16がリリースされました。注目すべき新機能には、エミュレートしたい特定のバージョンのPerlを指定できる機能があり、ユーザーはPerlのバージョンをアップグレードしながら、通常は互換性のない古いスクリプトを実行できます。[ 58 ] Perl 5.16では、コアも更新され、Unicode 6.1をサポートしています。[ 58 ]
2013年5月18日にPerl 5.18がリリースされました。注目すべき新機能には、新しいdtraceフック、字句サブ、CORE::サブの追加、セキュリティ上の理由によるハッシュの全面的な見直し、Unicode 6.2のサポートなどがあります。[ 59 ]
2014年5月27日、Perl 5.20がリリースされました。注目すべき新機能には、サブルーチンシグネチャ、ハッシュスライス/新しいスライス構文、後置参照(実験的)、Unicode 6.3、一貫性のある乱数生成器を使用したrand()関数などがあります。 [ 60 ]
一部の観察者は、Perl 5.10 のリリースが Modern Perl ムーブメントの始まりだと考えている。[ 61 ]特に、このフレーズは、CPAN の使用を受け入れ、言語の最近の発展を活用し、高品質のコードを作成することに厳格である開発スタイルを説明する。[ 62 ] 『 Modern Perl』[ 63 ]という書籍がこのアイデアの最も目立つ旗手かもしれないが、Enlightened Perl Organization [ 64 ]などの他のグループもこの活動を引き継いでいる。
2012年後半から2013年にかけて、Perl 5 の代替実装のためのいくつかのプロジェクトが開始されました。Rakudo Perl チームによるPerl6内の Perl5 [ 65 ] 、 Stevan Little とその仲間によるmoe [ 66 ] 、Reini Urban 率いる Perl11 チームによるp2 [ 67 ]、goccyによるgperl [ 68 ]、Will Braswell が主導し Perl11 プロジェクトと提携している Kickstarter プロジェクトであるrperl [ 69 ]などです。

2000年のPerlカンファレンスで、Jon Orwantは大規模な新しい言語イニシアチブの必要性を訴えた。[ 71 ]これにより、Perl 6と呼ばれる言語の再設計に着手することが決定された。新しい言語機能の提案はPerlコミュニティ全体から募集され、300件以上のRFCが提出された。[ 72 ]
ウォールはその後数年間、RFCを精査し、Perl 6の首尾一貫したフレームワークに統合した。彼はPerl 6の設計を「黙示録」と呼ばれる一連の文書で発表した。これらの文書は『Programming Perl』の章に対応する番号が付けられている。2011年1月現在 Perl 6 の開発仕様は、アポカリプスに対応する番号が付けられたシノプシスと呼ばれる設計文書にまとめられていました。[ 73 ]
ウォールが指導したブラッドリー・M・クーンによる論文研究では、Perl の実行環境としてJava 仮想マシンを使用する可能性が検討された。 [ 74 ]クーンの論文では、このアプローチには問題があることが示された。2001 年に、Perl 6 はParrotと呼ばれるクロス言語仮想マシン上で動作することが決定された。
2005年、オードリー・タンはHaskellでPerl 6を実装したPugsプロジェクトを作成しました。これはPerl 6言語のテストプラットフォームとして機能し(実際の実装の開発とは別)、言語設計者が探索できるようにしました。PugsプロジェクトはLibera Chatの#raku IRCチャンネルを中心とした活発なPerl/Haskellクロス言語コミュニティを生み出しました。Perl 6設計チームは多くの関数型プログラミングの影響を取り入れました。[ 75 ]
2012年、Perl 6の開発は主に2つのコンパイラを中心に進められました。[ 76 ]
2013年には、主にRakudo向けに設計されたC言語ベースの仮想マシンであるMoarVM (「Metamodel On A Runtime」)が発表された。[ 78 ]
2019年10月、Perl 6はRakuに改名された。[ 79 ]
2017年現在Rakudoの実装とMoarVMのみが活発に開発されており、Java仮想マシンやJavaScriptなどの他の仮想マシンもサポートされている。[ 80 ]
2020年6月、Perl 7がPerl 5の後継として発表されました。[ 81 ] Perl 7は当初Perl 5.32をベースにしており、2021年前半にリリースされる予定で、リリース候補版はそれより早く公開される予定でした。[ 82 ]
この計画は2021年5月に改訂されましたが、リリース時期やベースラインとして使用するPerl 5のバージョンは指定されていませんでした。[ 83 ] Perl 7がリリースされると、Perl 5は長期メンテナンスに入ります。ただし、サポートされているPerl 5バージョンは、重要なセキュリティとバグ修正を引き続き受けます。[ 84 ]
Perl 7 は、2020 年 6 月 24 日に「クラウドでの Perl カンファレンス」で Perl 5 の後継として発表されました。[ 82 ] [ 81 ] Perl 5.32 をベースにした Perl 7 は、最新の Perl 5 コードとの後方互換性を持つように計画されました。Perl 5 コードは、ボイラープレート(pragma) ヘッダーがないuse compat::perl5;と互換性を維持できませんが、最新のコードではボイラープレートの一部を削除できます。
しかし、Perl 7への移行計画はさらなる議論を巻き起こし、Perl運営委員会は、Perl 7でデフォルトとなるプラグマやモジュールに対応していないスクリプトの後方互換性の問題を回避するために、この計画を中止した。Perl 7は、開発者がメジャーリリースアップグレードを正当化するのに十分な機能を追加した場合にのみリリースされる。[ 85 ]
Wall氏によると、Perlには2つのスローガンがある。1つ目は「やり方は一つではない」で、一般的にはTMTOWTDI(ティム・トーディと発音)として知られている。このモットーの支持者たちは、この哲学によって簡潔な記述が容易になると主張している。[ 86 ] [ 87 ] [ 88 ]
2つ目のスローガンは「簡単なことは簡単に、難しいことは可能にすべきだ」です。[ 14 ]
Perl の設計は、コンピュータ業界における 3 つの大きな傾向、すなわちハードウェアコストの低下、労働コストの上昇、コンパイラ技術の向上への対応として理解できます。Fortran や C などの以前の多くのコンピュータ言語は、高価なコンピュータ ハードウェアを効率的に使用することを目的としていました。対照的に、 Perlはコンピュータ プログラマがより迅速かつ簡単にプログラムを記述できるように設計されました。[ 89 ]
Perlには、 CPUとメモリの要件が増加する代わりにプログラマの作業を容易にする多くの機能があります。これらには、自動メモリ管理、動的型付け、文字列、リスト、ハッシュ、正規表現、内省、関数が含まれますeval()。Perlは「組み込みの制限なし」の理論[ 27 ]に従っており、これはゼロイチ無限ルールに似た考え方です。
ウォールは言語学者としての訓練を受けており、Perl の設計は言語学の原則に大きく影響を受けている。例としては、ハフマン符号化(一般的な構造は短くするべき)、適切な末尾重み付け(重要な情報は最初に来るべき)、そして多数の言語プリミティブが挙げられる。Perl は、Perl インタプリタを複雑にする場合でも、人間が記述するのに簡潔で自然な言語構造を優先する。[ 90 ]
Perl の構文は、「異なるものは異なる見た目であるべきだ」という考えを反映しています。[ 91 ]例えば、スカラー、配列、ハッシュには異なる先頭記号があります。配列のインデックスとハッシュキーには異なる種類の括弧が使用されます。文字列と正規表現には異なる標準区切り文字があります。
Perl 言語とそれを取り巻くコミュニティや文化には、幅広い実用的な傾向が見られます。Programming Perlの序文は、「Perl は仕事を成し遂げるための言語です」という言葉で始まります。[ 14 ]その結果、Perl は整然とした言語ではありません。多くの機能を備え、規則の例外を許容し、構文の曖昧さを解決するためにヒューリスティックを使用します。コンパイラの寛容な性質のため、バグを見つけるのが難しい場合があります。Perl の関数ドキュメントでは、リストとスカラーのコンテキストにおける組み込み関数のさまざまな動作について、「一般的には、一貫性を求めない限り、それらはあなたの望むことを実行します」と述べています。[ 92 ]
Perl の全体的な構造は、大まかに C 言語に由来しています。Perl は手続き型言語であり、変数、式、代入文、中括弧で囲まれたブロック、制御構造、サブルーチンを備えています。[ 93 ]
Perl はシェル プログラミングの特徴も取り入れています。すべての変数は先頭にシジルでマークされ、変数を文字列に直接挿入できます。ただし、シェルとは異なり、Perl は変数へのすべてのアクセスにシジルを使用し、シジルを使用する他のほとんどのプログラミング言語とは異なり、シジルは変数の型ではなく式の型を示します。たとえば、配列はシジル "@" (例: ) で表されますが、配列の個々の要素はスカラーシジル "$" (例: ) で表されます。Perl には、ソートやオペレーティングシステムの機能の呼び出しなど、シェル プログラミングでよく使用されるツールを提供する組み込み関数も多数あります (ただし、これらのツールの多くはシェル以外のプログラムによって実装されています) 。@arrayname$arrayname[3]
PerlはAWKからハッシュ(連想配列)を、sedから正規表現を取り入れています。これらは、多くの構文解析、テキスト処理、データ管理タスクを簡素化します。Lispと共通しているのは、ブロック内の最後の値が暗黙的に返されること、そしてすべてのステートメントが式であり、それ自体がより大きな式の中で使用できることです。
Perl 5 では、複雑なデータ構造、第一級関数(つまり、クロージャを値として扱う)、オブジェクト指向プログラミング モデルをサポートする機能が追加されました。これには、参照、パッケージ、クラスベースのメソッド ディスパッチ、字句スコープ変数、コンパイラ ディレクティブ(たとえば、strictプラグマ) が含まれます。Perl 5 で導入された主要な追加機能は、コードを再利用可能なモジュールとしてパッケージ化できる機能でした。Wall は後に、「Perl 5 のモジュール システムの全体的な意図は、Perl コアではなく Perl カルチャーの成長を促進することだった」と述べています。[ 94 ]
Perlのすべてのバージョンは、自動的なデータ型判定と自動的なメモリ管理を行います。インタプリタは、プログラム内のすべてのデータオブジェクトの型と記憶領域要件を把握しており、参照カウントを使用して必要に応じて記憶領域を割り当てたり解放したりします(そのため、手動による介入なしに循環データ構造を解放することはできません)。数値から文字列への変換など、適切な型変換は実行時に自動的に行われますが、不適切な型変換は致命的なエラーとなります。
Perl は、批判者から「行ノイズ」や「書き込み専用言語」と呼ばれてきました。Randal L. Schwartz は、著書Learning Perlの初版[ 95 ]の第 1 章で、「確かに、Perl は初心者には行ノイズのように見えることがありますが、熟練した Perl プログラマーにとっては、人生の使命を持ったチェックサム付きの行ノイズのように見えます。」と述べています。 [ 96 ]また、Perl が書き込み専用言語であるという非難は、「適切な注意」をもってコーディングすることで回避できるとも述べています。[ 96 ] Perl の概要ドキュメントperlintro では、組み込みの「マジック」スカラー変数の名前は「句読点や行ノイズのように見える」と述べています。[ 97 ]しかし、英語モジュールでは、長い英語と短い英語の両方の代替案を提供しています。perlstyleドキュメントでは、正規表現の行ノイズは、空白を追加する修飾子を使用することで軽減できると述べています。[ 98 ]/x
Perl 6 FAQによると、[ 99 ] Perl 6は、Perl 5の批判者から「行ノイズ」という主張を引き起こす「いつもの容疑者」を軽減するように設計されており、「句読点変数の大部分」の削除や正規表現構文のサニタイズなどが含まれています。Perl 6 FAQでは、Perlの行ノイズと呼ばれることがあるものは、動名詞や前置詞が英語の一部であるのと同様に、「言語の実際の構文」であるとも述べています。[ 99 ] 2012年12月のブログ投稿で、chromaticは「Rakudo Perl 6は失敗しており、大人の監督を受けない限り失敗し続けるだろう」と主張しながらも、 Perl 6の設計には「明確に定義された文法」、「改良された型システム、インテリジェントなメタモデル、メタ演算子、そして広範な遅延評価などの細かな点を提供するより明確なコンテキストシステム」があると述べています。[ 100 ]彼はまた、「Perl 6 には Perl 5 にはない一貫性と整合性がある」と述べた。[ 100 ]
Perlでは、「Hello, World!」プログラムは次のように記述できます。
print "こんにちは、世界!\n" ;以下は、指定された開始値から秒数をカウントダウンする、より複雑なPerlプログラムです。
#!/usr/bin/env perl use strict ; use warnings ;私の($remaining 、$total )$remaining = $total = shift ( @ARGV );STDOUT -> autoflush ( 1 );while ( $remaining ) { printf ( "残り %s/%s \r" , $remaining -- , $total ); sleep 1 ; }print "\n" ;上記のコードを実行するには、それをという名前のファイルに保存しcounter.pl、実行します。
$ perl counter.pl 42Perlインタープリタは、コマンドライン上で単発のスクリプトを実行するためにも使用できます。次の例( Bashなどのsh互換シェルから実行した場合)は、現在のディレクトリにある拡張子が.txtのすべてのファイル内の文字列「Bob」を「Robert」に変換します。
$ perl -i.bak -lp -e 's/Bob/Robert/g' *.txt Perl 5 までのバージョンには Perl 言語の文書化された仕様や標準は存在せず、現在のバージョンの Perl についても作成する予定はありません。インタープリタの実装は 1 つしかなく、言語はそれと共に進化してきました。そのインタープリタとその機能テストは、事実上の言語仕様となっています。しかし、Perl 6 は仕様から始まり[ 101 ]、いくつかのプロジェクト[ 102 ]がその仕様の一部または全部を実装することを目指しています。
Perlは、C言語で書かれたコアインタプリタとして実装されており、PerlとC言語で書かれた多数のモジュールも含まれています。2010年現在インタプリタは15万行のC言語コードで構成され、 一般的なマシンアーキテクチャでは1MBの実行ファイルにコンパイルされます。あるいは、インタプリタをリンクライブラリにコンパイルして、他のプログラムに組み込むこともできます。配布パッケージには約500個のモジュールが含まれており、20万行のPerlコードと35万行のC言語コードで構成されています(モジュール内のC言語コードの大部分は文字エンコーディングテーブルです)。
インタプリタはオブジェクト指向アーキテクチャを採用しています。スカラー、配列、ハッシュ、コード参照、ファイルハンドルなど、Perl言語のすべての要素は、インタプリタ内でC言語の構造体によって表現されます。これらの構造体に対する操作は、多数のマクロ、typedef 、関数によって定義されており、これらがPerl C APIを構成します。Perl APIは初心者には難解に感じられるかもしれませんが、エントリポイントは一貫した命名規則に従っており、利用者にとって分かりやすいものとなっています。
Perl インタプリタのライフサイクルは、大きくコンパイルフェーズと実行フェーズに分けられます。[ 103 ] Aluín らによると、「Perl は、単純な Lex/Yacc 字句解析器/構文解析器の組み合わせでは解析できません。代わりに、インタプリタは独自の字句解析器を実装し、修正された GNU bison 構文解析器と連携して言語の曖昧さを解決します。」[ 104 ]
Perl のコンパイル フェーズで起こることのほとんどはコンパイルであり、Perl の実行フェーズで起こることのほとんどは実行ですが、重要な例外があります。Perl はコンパイル フェーズ中に Perl コードを実行する機能を活用します。Perl はコンパイルを実行フェーズに遅延させることもあります。任意の時点で実際に行われている処理の種類を示す用語は、コンパイル時間と実行時間です。Perl はコンパイル フェーズのほとんどの時点でコンパイル時間ですが、コンパイル時間は実行フェーズ中にも発生する可能性があります。組み込み関数に渡される文字列引数内のコードのコンパイル時間は、eval実行フェーズ中に発生します。Perl はコンパイル フェーズ中に実行時間になることが多く、実行フェーズのほとんどを実行時間で過ごします。BEGINブロック内のコードはコンパイル フェーズで実行時に実行されます。
コンパイル時に、インタプリタは Perl コードを構文木に解析します。実行時には、木を走査してプログラムを実行します。テキストは一度だけ解析され、構文木は実行前に最適化されるため、実行は比較的効率的です。構文木に対するコンパイル時の最適化には定数畳み込みとコンテキスト伝播が含まれますが、ピーホール最適化も実行されます。[ 105 ]
Perl は、コンパイルフェーズで実行される実行時コードによって構文解析が影響を受ける可能性があるため、チューリング完全な文法を持っています。 [ 106 ]このコードは、通常のLex / Yacc字句解析器/構文解析器では解析できません。言語の曖昧さを解消するために、インタプリタは修正されたGNU bison構文解析器と連携する独自の字句解析器を実装する必要があります。[ 107 ]
「Perl だけが Perl を解析できる」 [ 108 ]とよく言われるが、これは Perl インタプリタ ( perl) だけが Perl 言語 ( Perl ) を解析できるという意味だが、一般にはこれも正しくない。Perl インタプリタはコンパイル段階でチューリング マシンをシミュレートできるため、あらゆる場合において解析を完了するには停止問題を判定する必要がある。停止問題は判定不能であることが長年の定説であり、したがって Perl でさえ常に Perl を解析できるとは限らない。Perl は、コンパイル段階でユーザーにプログラミングの全権限を与えるという珍しい選択をしている。理論的な純粋さという点ではコストは高いが、実際的な不便さはまれであるようだ。[ 109 ]
ソースコードアナライザーや自動インデントツールなど、Perl の解析を行う他のプログラムは、曖昧な構文構造だけでなく、一般的な場合の Perl の解析の決定不能性にも対処しなければなりません。Adam Kennedyの PPI プロジェクトは、Perl を実行可能なコードとして解析するのではなく (Perl 自身でさえ常にできるとは限らない)、Perl コードをドキュメントとして解析すること (ドキュメントとしての整合性を維持すること) に焦点を当てていました。Kennedy は最初に「Perl の解析は『停止問題』に悩まされる」と推測し[ 110 ]、後にそれが証明されました[ 111 ] 。
Perlには、コアPerl言語用の25万を超える機能テストと、コアモジュール用の25万を超える機能テストが同梱されています。これらのテストは通常のビルドプロセスの一部として実行され、インタプリタとそのコアモジュールを徹底的に検証します。Perl開発者は、これらの機能テストによって、インタプリタへの変更がソフトウェアバグを引き起こさないことを保証できます。さらに、Perlユーザーは、自分のシステムでインタプリタが機能テストに合格したことを確認することで、インタプリタが正しく動作していることを確信できます。
Perl はArtistic License 1.0 [ 4 ] [ 5 ]とGNU General Public License [ 6 ]の両方のライセンスで提供されています。ほとんどのオペレーティングシステム向けのディストリビューションが利用可能です。特にUnixおよびUnix ライクなシステムで広く使われていますが、ほとんどの最新の (そして多くの古い) プラットフォームにも移植されています。報告されている例外は 6 つだけで、Perl はPOSIX準拠、またはその他の Unix 互換のプラットフォームでソース コードからコンパイルできます。 [ 112 ]
従来の Mac OS環境に必要な特殊な変更のため、MacPerl と呼ばれる特別なポートが別途出荷されました。[ 113 ]
Comprehensive Perl Archive Network には、サポートされているプラットフォームの完全なリストと、それぞれのプラットフォームで利用可能なディストリビューションへのリンクが掲載されています。[ 114 ] CPAN は、コア Perl ディストリビューションに含まれていない、公開されている Perl モジュールのソースでもあります。
ActivePerl はActiveState 社のクローズド ソース ディストリビューションで、コア Perl リリースに追随する定期的なリリースがあります。[ 115 ]このディストリビューションには以前はPerl パッケージ マネージャ(PPM) [ 116 ]が含まれていましたが、これは一般的な Perl モジュールのインストール、削除、アップグレード、および使用管理によく使われるツールです。しかし、このツールは ActivePerl 5.28 で廃止されました。[ 117 ]また、Perl 言語を実装するWindows Script Host (WSH) エンジンであるPerlScriptも含まれています。Visual Perlは、Visual Studio .NET開発スイートに Perl を追加する ActiveState ツールです。この会社からは、 VBScriptから Perl へのコンバータ、Windows 用の Perl コンパイラ、AWKおよびsedから Perl へのコンバータも作成されており、ActiveState CD for Windowsに含まれています。この CD には、同社のすべてのディストリビューションとKomodo IDE、および 2002 年以降の Unix–Linux–POSIX 版のすべてが含まれています。
コンピュータ言語ベンチマークゲームは、いくつかのプログラミング言語における典型的なプログラミング問題の実装のパフォーマンスを比較します。[ 118 ]提出されたPerlの実装は、通常、メモリ使用量のスペクトルの上限に近いパフォーマンスを示し、速度の結果は様々です。ベンチマークゲームにおけるPerlのパフォーマンスは、インタプリタ型言語としては典型的です。[ 119 ]
Perl の大規模プログラムは、コンパイル言語の同様のプログラムよりも起動が遅くなります。これは、Perl が実行されるたびにソースをコンパイルする必要があるためです。YAPC ::Europe 2005カンファレンスでの講演とそれに続く記事「A Timely Start」で、Jean-Louis Leroy は、Perl インタプリタが大きすぎるインクルード パス内のモジュールを見つけるのにかなりの時間を費やしたため、Perl プログラムの実行に予想以上に時間がかかったことを発見しました。[ 120 ] Java、Python、Ruby とは異なり、Perl は事前コンパイルを実験的にサポートしているだけです。[ 121 ]そのため、Perl プログラムは実行のたびにこのオーバーヘッドのペナルティを支払います。一般的なプログラムの実行フェーズは十分に長いため、償却された起動時間はそれほど大きくありませんが、非常に短い実行時間を測定するベンチマークは、このオーバーヘッドのために歪む可能性があります。[ 122 ]
この状況を改善するために、いくつかのツールが導入されてきました。最初のツールはApacheのmod_perlで、小さなPerlプログラムが高速に呼び出される最も一般的な理由の1つであるCGI Web開発に対処することを目的としていました。Microsoft ISAPIを介したActivePerlも同様のパフォーマンス改善を提供します。[ 123 ]
Perl コードはコンパイルされると、実行フェーズで追加のオーバーヘッドが発生しますが、これは通常、C や C++ などのコンパイル言語で書かれたプログラムには存在しません。このようなオーバーヘッドの例としては、バイトコードの解釈、参照カウントによるメモリ管理、動的型チェックなどがあります。[ 124 ]
最も重要なルーチンは他の言語(Cなど)で記述でき、単純なインラインモジュールまたはより複雑だが柔軟なXSメカニズムを介してPerlに接続できます。[ 125 ]
Perlには多種多様な用途があり、多くの標準モジュールやサードパーティ製モジュールが利用できることで、その可能性はさらに広がっている。
Perl は主にCGIスクリプトの作成に使用されてきました。Perl で書かれた大規模プロジェクトには、 cPanel、Slash、Bugzilla、RT、TWiki、Movable Typeなどがあります。Perl を多用しているトラフィック量の多い Web サイトには、Priceline.com、Craigslist、[ 126 ] IMDb、[ 127 ] LiveJournal、DuckDuckGo、[ 128 ] [ 129 ] Slashdot、Ticketmasterなどがあります。また、 Web 開発でよく使われるLAMPテクノロジー スタック のオプション コンポーネントとして、 PHPやPythonの代わりに使われています。Perl は、 Debian Linuxディストリビューションでシステム プログラミング言語として広く使われています。[ 130 ]
Perl は、相互運用するように特別に設計されていないシステムやインターフェースを結びつける接着剤言語として、また「データ処理」[ 131 ] 、つまりレポート作成などのタスクのために大量のデータを変換または処理するために使用されることが多い。これらの強みは密接に関連している。この組み合わせにより、Perl はシステム管理者にとって人気の高い汎用言語となっている。特に、短いプログラム、しばしば「ワンライナー プログラム」と呼ばれるプログラムを単一のコマンドラインで入力して実行できるためである。
Perl コードはWindowsと Unix間で移植可能にすることができます。このようなコードは、ソフトウェアのビルドおよびデプロイメント スクリプトのパッケージングとメンテナンスを簡素化するために、ソフトウェアのサプライヤー (市販の既製品 (COTS) と特注の両方) によってよく使用されます。[ 132 ]
Perl/TkとwxPerlは、 Perlスクリプトにグラフィカルユーザーインターフェースを追加するためによく使用されます。
Perl のテキスト処理機能はSQLクエリの生成に使用できます。配列、ハッシュ、自動メモリ管理により、返されたデータの収集と処理が容易になります。たとえば、Tim Bunce のPerl DBIアプリケーション プログラミング インターフェイス(API) では、API の引数は SQL クエリのテキストにすることができます。そのため、複数の言語で同時にプログラミングすることが可能です (たとえば、ヒア ドキュメントでHTML、JavaScript、SQLを使用してWeb ページを生成する場合)。Perl の変数補間を使用して各 SQL クエリをプログラムでカスタマイズし、各 SQL クエリの結果データセットをプログラムで保持する構造として Perl 配列またはハッシュを指定することで、Perl サブルーチンによる後処理のために大量のデータを処理するための高レベルのメカニズムが可能になります。[ 133 ] Perl の初期バージョンでは、データベース インターフェイスは、インタープリタをクライアント側のデータベース ライブラリに再リンクすることによって作成されました。これは非常に困難であったため、最も重要で最も広く使用されているデータベースのごく一部に対してのみ実施され、結果として得られる実行ファイルは一度に1つのデータベースインターフェースしか使用できないように制限された。[ 134 ]perl
Perl 5 では、データベース インターフェースは Perl DBI モジュールによって実装されています。DBI (Database Interface) モジュールは、単一のデータベース非依存のインターフェースを Perl アプリケーションに提供し、DBD (Database Driver) モジュールは約 50 種類のデータベースへのアクセスの詳細を処理します。ほとんどのANSI SQLデータベースには DBD ドライバがあります。[ 135 ]
DBIはデータベースハンドルとクエリのキャッシュを提供し、 mod_perlなどの長時間実行環境でのパフォーマンスを大幅に向上させ、Slashdot効果[ 137 ]のような負荷スパイクを回避するのに役立ちます。[ 136 ]
現代の Perl アプリケーション、特にCatalystなどのWeb フレームワークを使用して書かれたアプリケーションでは、DBI モジュールは、DBIx::Class、Class::DBI [ 138 ]、Rose::DB::Object [ 139 ]などのオブジェクト関係マッパーを介して間接的に使用されることが多く、これらのマッパーは SQL クエリを生成し、アプリケーション作成者に対して透過的にデータを処理します。[ 140 ]
Perl の文化とコミュニティは、言語自体と共に発展してきました。UsenetはPerl が初めて公開された場でしたが、その進化の過程で、World Wide Web の導入を含むインターネットベースのサービスの拡大によって Perl コミュニティが形成されました。実際、Perl を取り巻くコミュニティは、Wall の最初の「State of the Onion」講演のテーマでした。[ 141 ]
State of the Onion は、ウォール氏が毎年行っているPerl とそのコミュニティの進歩に関する基調講演形式の要約の名称です。これらの講演は、ウォール氏特有のユーモアが特徴で、Perl の文化、より広範なハッカー文化、ウォール氏の言語的背景、時には家族生活、そして時にはキリスト教の背景への言及も含まれています。 [ 142 ]各講演は、まずさまざまな Perl カンファレンスで発表され、最終的にはオンラインでも公開されます。
電子メール、Usenet、およびメッセージボードの投稿では、「Just another Perl hacker」(JAPH)プログラムがよく使われており、これは初期のプロのPerlトレーナーの一人であるRandal L. Schwartzによって始められました。 [ 143 ] Perl文化の用語では、PerlプログラマーはPerlハッカーとして知られており、そこから「Just another Perl hacker , [ sic ] 」というフレーズを出力する短いプログラムを作成する習慣が生まれました。元のコンセプトの精神に則り、これらのプログラムは適度に難読化されており、電子メールやUsenetメッセージの署名に収まるほど短くなっています。Schwartzによって開発された「標準的な」JAPHには最後にコンマが含まれていますが、これはしばしば省略されます。[ 144 ]
Perl「ゴルフ」とは、ゴルフ選手がラウンドでできるだけ少ないショット数を目指すの と同様に、Perlプログラムで使用する文字数(キー「ストローク」)を最小限に減らす趣味のことである。このフレーズが最初に使われた[ 145 ]のは、初心者に教えるための平凡なコードと、経験豊富なPerlプログラマーを楽しませるような簡潔なハックとの違いを強調するためであり、後者の例としては、Usenetの投稿などで署名にすでに使われていたJAPHが挙げられる。同様の技は、数十年前からAPL言語で名前のない趣味として行われていた。RSA暗号化を実行するプログラムをPerlで書いたことで、この趣味への広く実用的な関心が高まった[ 146 ] 。その後、「コードゴルフ」という用語は、他の言語でのこの趣味にも適用されるようになった[ 147 ] 。 2000年7月、カリフォルニア州モントレーで開催されたPerl Conference 4.0で、Perl Golf Apocalypseが開催された。
C言語と同様に、難読化コードのコンテストは1990年代後半によく知られた娯楽でした。難読化Perlコンテストは、 Perlジャーナルが1996年から2000年にかけて開催したコンテストで、Perlの構文の柔軟性を最大の利点としていました。「最も強力なプログラム」(スペースを効率的に使用するプログラム)や「最高の4行署名」(Usenet署名ブロックのスタイルで76文字の4行に収まるプログラム)などのカテゴリで賞が授与されました。[ 148 ]
Perl詩とは、例えば「 Black Perl 」として知られる作品のように、合法的なPerlコードとしてコンパイルできる詩を書く行為である。Perl詩は、Perl言語で使用される多数の英単語によって可能となる。PerlMonksのコミュニティには、新しい詩が定期的に投稿されている。[ 149 ]
Yet Another Perl Conference [ 150 ] : 754 [ 151 ] : 14 ( YAPCとも呼ばれる)、2016~2019 年はThe Perl Conference ( TPC ) と呼ばれ、2020 年以降はThe Perl and Raku Conferenceと呼ばれているこの会議は、1999 年以来開催されているPerlプログラミング言語について議論する一連の会議です。通常、The Perl FoundationとYet Another Society (「コンピュータおよび情報科学における共同作業の推進のための非営利法人」) の後援のもとで開催されます。
第 1 回 YAPC は、1999 年 6 月 24 日と 25 日に米国ペンシルベニア州ピッツバーグのカーネギーメロン大学で開催されました。 [ 150 ]主催はKevin Lenzo氏です。[ 152 ] YAPC の起源は、非営利の Perl Mongers ユーザー グループにあります。[ 153 ] [ 154 ]第 1 回カンファレンスでは、さまざまな Perl 関連のトピックについて 31 人の講演者がスケジュールに集まりました。
低コストの Perl カンファレンスのアイデアはすぐに広まりました。最初のヨーロッパ版 YAPC は、2000 年にロンドンの Perl Mongers のメンバーによって組織され、[ 155 ] 2003 年にイスラエル、[ 154 ] 2004 年にオーストラリア、 2005 年にアジアとブラジル、 2008 年にロシアで開催されました。YAPCが開催されたことのない大陸は、アフリカと南極大陸だけです。
2016年、YAPCはThe Perl Conferenceに名称を変更しました[ 156 ] : 757。これはO'Reilly Open Source Convention (OSCON)の旧称です。2020年現在、Perl 6がRakuに名称変更されたことを反映して、The Perl and Raku Conferenceと名乗っています。
2002年までに、The Perl Developer's DictionaryはYAPCをO'ReillyのOpen Source Conferenceに次いでPerlシーンで2番目に重要なカンファレンスとして挙げた。 [ 11 ] Minimal PerlはYAPCを「より凝ったカンファレンスの費用を負担できない人、あるいは企業のIT担当者よりも学生やギークとの交流を好む人のために世界中で開催される低価格の草の根イベントの集まり」と説明している。[ 157 ]このカンファレンスは、2000年代のPerlプログラミングに関する他のさまざまな書籍でも推奨されている。[ 158 ]
オランダのLinux Magazineは、2001年にアムステルダムで開催された第2回ヨーロッパYAPC会議をレビューし、会議のテーマがセキュリティであったにもかかわらず、主催者がネットワークトラフィックを傍受し、参加者の何人かが暗号化されていないパスワードを使用していたことを明らかにしたときの困惑について述べている。[ 159 ]その年のその他のトピックには、ユーザーインターフェースの構築、音声のためのPerlの使用、並列プログラミングなどがあり、会議には約250人の参加者による3つの並行セッションがあった。
この名前は、 yacc(Yet Another Compiler Compiler)へのオマージュです。
これらのイベントはCONISLIと共同で開催されます。
すべての言語設計者には時折、独特の癖がある。私はただ、ほとんどの人よりそれが得意なだけだ。
「Perl」は言語ファミリーであり、「Perl 6」はそのファミリーの一部ではありますが、独自の開発チームを持つ独立した言語です。「Perl 6」の存在は、「Perl 5」の継続的な開発に大きな影響を与えるものではありません。
この文書では、Perl 6をRakuに名前変更するために実行すべき手順について説明します。
の最大の強みは、テキスト、行指向のデータ形式をパターン指向で処理するための非常に強力な組み込み機能であり、この点では他に類を見ません。
は、パターンマッチング入力を伴うあらゆるタスクにおいて、常に頼りになる言語でした。
の比類なきテキスト処理能力…
ツール」など、他の略称でも呼ばれています。実際には頭字語ではなく逆頭字語で、Perlの生みの親であるラリー・ウォールが先に名前を考え、後から略称を考え出したためです。そのため、「Perl」はすべて大文字ではありません。どちらの略称が正しいかを議論しても意味がありません。ラリー自身も両方を認めています。
{{cite book}}:|website=無視されました (ヘルプ){{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)Perl 7 へのバージョンアップは予定通り行われるが、5.34.0 のリリース直後ではない。
... 12 か月以内に [Perl 7] を提供できるとは考えていない。
…私たちは何も失っていないように見える。実際的なデメリットを示すことができた人は誰もいない。
はDebianでかなり広く使われています。コア関数の一部がPerlで書かれているだけでなく、unstableには名前にperlを含むパッケージが700以上あります(2004年3月)。
{{cite newsgroup}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク){{cite book}}: CS1メンテナンス: パブリッシャーの場所 (リンク)