web-dev-qa-db-ja.com

PerlとPHPの違い

私はPerl 5を学ぶつもりで、今までPHPしか使っていなかったので、言語の違いについて少し知りたいと思っていました。

PHPは「Perlハック」のセットとして開始されたため、明らかにPerlの機能の一部を複製しました。

  • 構文の主な違いは何ですか? Perlには、何かを表現するためのより多くのオプションと方法があるのは本当ですか?

  • Perlが動的なWebサイトに使用されなくなったのはなぜですか?何がPHP=の人気を集めましたか?

100
lok

PerlとPHPは似ているよりも異なります。 Perl 6はまだ開発中なので、Perl 5を考えてみましょう。いくつかの違いは、おおよそ主題ごとにグループ化されています:

  • Perlは、正規表現リテラルを含むネイティブの正規表現をサポートしています。 PHPは、拡張機能としてPerlの正規表現関数を使用します。
  • Perlには、さらに多くの operators があります。これには、 matching (_=~_、_!~_ )、 quote-likeqwqx&c。)、 exponentiation (_**_)、 string repeatx)および range (_.._および_..._)。 PHPには、Perlにない演算子がいくつかあります。たとえば、 エラー抑制演算子 (_@_)、 instanceof (Perlには_Universal::isa_メソッドがあります)および clone
  • PHPでは、 new は演算子です。 Perlでは、これはパッケージで定義された オブジェクト作成サブルーチン の従来の名前であり、言語に関する限り特別なものではありません。
  • Perlの論理演算子は引数を返しますが、PHPでは return booleans を返します。試してください:

    _$foo = '' || 'bar';
    _

    各言語で。 Perlでは、_$foo ||= 'default'_を実行して、$ fooがまだ設定されていない場合に値を設定することもできます。 PHPでこれを行う最短の方法は$foo = isset($foo) ? $foo : 'default';です(更新、PHP 7.0+では_$foo = $foo ?? 'default'_を実行できます)

  • Perl variable names は組み込み型を示し、Perlには3つあり、型指定子は名前の一部です(「 」と呼ばれます)/sigil ")、したがって_$foo_は_@foo_または_%foo_とは異なる変数です。
  • (前の点に関連)Perlには、スカラー、配列、ハッシュ、コード、ファイル/ディレクトリハンドル、およびフォーマット用の個別の symbol table エントリがあります。それぞれに独自の名前空間があります。
  • Perlは symbol table へのアクセスを許可しますが、それを操作するのは気弱な人向けではありません。 PHPでは、シンボルテーブルの操作は、 references および extract 関数の作成に制限されています。
  • 「参照」は、PHPとPerlでは異なる意味を持つことに注意してください。 PHPでは、 references はシンボルテーブルエイリアスです。 Perlでは、 references はスマートポインターです。
  • Perlには、整数インデックス付きコレクション(配列)と文字列インデックス付きコレクション(ハッシュ)の異なるタイプがあります。 PHPでは、それらは同じタイプです: 連想配列/順序付きマップ
  • Perl配列はスパースではありません。配列の現在のサイズよりも大きいインデックスで要素を設定すると、介在するすべての要素がundefinedに設定されます( perldata を参照)。 PHP配列はまばらです。要素を設定しても、介在する要素は設定されません。
  • Perlはハッシュと配列 slices をネイティブにサポートし、スライスはすべての種類の uses を使用して割り当て可能です。 PHPでは、 _array_slice_ を使用してスライスを抽出し、 _array_splice_ を使用して割り当てます。スライスに。
  • 添え字演算子の argumentは、PHPの添え字演算子 から除外して、少し魔法をかけることができます。 Perlでは、添え字を省略できません。
  • Perlハッシュは unordered です。
  • Perlには、多数の predefinedとマジック変数 があります。 PHPの predefined variables の目的はまったく異なります。
  • Perlには statement modifiers があります:一部の制御ステートメントはステートメントの最後に配置できます。
  • Perlは、localキーワードを介して dynamic scoping をサポートします。
  • さらに、Perlにはグローバル、レキシカル(ブロック)、およびパッケージ scope があります。 PHPには、グローバル、関数、オブジェクト、クラス、および名前空間 scope があります。
  • Perlでは、変数はデフォルトでグローバルです。 PHPでは、関数の変数はデフォルトでローカルです。
  • Perlは、 goto 関数を介して明示的な tail calls をサポートします。
  • Perlの prototypes は、関数引数に対して、PHPの type hinting よりも限定的な型チェックを提供します。その結果、プロトタイプは、タイプヒンティングよりも制限された有用性があります。
  • Perlでは、ステートメントが式である場合(つまり、値を持っている場合)、returnステートメントが使用されていなくても、最後に評価されたステートメントがサブルーチンの値として返されます。ループなど、最後のステートメントが式ではない(つまり、値を持たない)場合、戻り値は指定されません( perlsub を参照)。 PHPでは、明示的な戻り値がない場合、 return値はNULL です。
  • Perlはリストをフラット化します( perlsub を参照);平坦化されていないデータ構造には、参照を使用します。

    _@foo = qw(bar baz);
    @qux = ('qux', @foo, 'quux'); # @qux is an array containing 4 strings
    @bam = ('bug-AWWK!', \@foo, 'fum'); # @bam contains 3 elements: two strings and a array ref
    _

    PHPは配列を平坦化しません。

  • Perlには、 special code blocksBEGINUNITCHECKCHECKINIT、およびEND)が実行されます。 PHPの _auto_prepend_file_ および _auto_append_file_ とは異なり、次の数に制限はありません。コードブロックの各タイプ。また、コードブロックはスクリプト内で定義されますが、PHPオプションはサーバーおよびディレクトリごとの構成ファイルで設定されます。
  • Perlでは、セミコロン separates statement 。 PHPでは、 terminates それらを除きます。ただし、PHP終了タグ( "?>")もステートメントを終了できます。
  • Perlの式の値は context sensitive です。
  • Perlの負の添え字は、配列の末尾に相対的です。 _$bam[-1]_は配列の最後の要素です。 PHPの負の添字は、他の添字です。
  • Perl 5では、クラスはパッケージに基づいており、PHP(または他のほとんどの言語)のクラスのようには見えません。 Perl 6クラスはPHPクラスに近いですが、それでもかなり異なります。 (Perl 6は、他の多くの方法でPerl 5から different ですが、それはトピックから外れています。)Perl 5とPHPの違いの多くは、 OO機能のほとんどがPerlに組み込まれているのではなく、ハッキングに基づいているという事実。たとえば、$obj->method(@args)は_(ref $obj)::method($obj, @args)_のようなものに変換されます。非網羅的なリスト:
    • PHPは、メソッドに特別な変数_$this_を自動的に提供します。 Perlは、メソッドへの最初の引数としてオブジェクトへの参照を渡します。
    • Perlは、オブジェクトを作成するために、参照を blessed にする必要があります。参照は、特定のクラスのインスタンスとして祝福できます。
    • Perlでは、パッケージ_@ISA_変数を介して継承を動的に変更できます。
  • Perlは operator overloading をサポートしています。
  • 厳密に言えば、Perlには複数行のコメントはありませんが、 [〜#〜] pod [〜#〜] システムを同じ効果に使用できます。
  • Perlでは、_//_は演算子です。 PHPでは、1行のコメントの始まりです。
  • PHP 5.3まで、PHPは匿名関数(_create_function_関数)をひどくサポートし、クロージャーをサポートしていませんでした。
  • PHPには、 namespaces が導入されたバージョン5.3まではPerlのパッケージのようなものはありませんでした。
  • おそらく、Perlの例外の組み込みサポートは、他の言語の例外にほとんど似ていないため、例外のようには見えません。ブロックを評価し、_$@_の値を確認します(evalの代わりにtrydie の代わりにthrow)。 エラーTry :: Tiny モジュールは、他の言語で見つかった例外をサポートします( にリストされた他のモジュールも同様です) /エラーの関連項目 セクション)。

PHPは同様にPerlに触発されましたPhantom of the ParadisePhantom of the Opera、またはStrange Brewは、Hamletに触発されました。 Perlを学習するときは、PHPの動作仕様を頭から外すのが最善です。そうしないと、つまずきます。

今、私の脳が痛いので、やめます。

280
outis

PHPが登場したとき、誰もがPerlとの主な違いに感銘を受けました。

  1. 既にグローバルスコープにある入力変数、退屈な解析はありません。
  2. HTML埋め込み。ただ<?php ... ?>どこでも。退屈なテンプレートはありません。
  3. 画面上のエラーメッセージ。退屈なエラーログのピークはありません。
  4. 簡単に学べる。退屈な本の読書はありません。

時間が経つにつれて、誰もが彼らが利益ではないことを学びました...

43

ほとんどのPHP対Perlページは、

<ここにラメの理由を挿入>

ilk、および合理的な比較を行うことはめったにありません。

構文的には、PHPは多くの場合、Perlよりも理解しやすいことがわかります(特に経験がない場合)。たとえば、PHPの先頭および末尾の空白の文字列をトリミングするのは単純です

$string = trim($string);

Perlでは、やや不可解です

$string =~ s/^\s+//;
$string =~ s/\s+$//;

(これは、1行のキャプチャと置換よりもわずかに効率的であり、もう少し理解しやすいと思います。)ただし、PHPは多くの場合英語に似ていますが、低レベルC、たとえば、strpbrkおよびstrspnはおそらくほとんど使用されません。ほとんどのPHPダブラーは、マニュアルの探索に時間を費やすのではなく、難解すぎるものに対して独自の同等の関数を作成するためです。 。また、英語が第二言語であるプログラマーについても疑問に思います。誰もがPerlのようなものと対等な立場にあり、英語をゼロから学ぶ必要があるからです。

マニュアルについてはすでに言及しました。 PHPには素晴らしいオンラインマニュアルがありますが、残念ながらそれは必要です。パラメーターの順序や関数の命名規則など、単純であるべきことについては、時々それを参照しています。 Perlを使用していると、おそらくマニュアルを参照していることに気付くでしょうlot始めると、いつかa -ha瞬間であり、二度とそれを必要としません。まあ、少なくともあなたがより高度になり、複数の方法があるだけでなく、おそらくもっと良い方法があることに気付くまでは、おそらく他の誰かがすでにそれをより良い方法で行っているので、おそらくあなたはCPANを訪れるべきです。

Perlには、物事を表現するためのより多くのオプションと方法があります。これは必ずしも良いことではありませんが、賢明に使用すればコードを読みやすくすることができますし、少なくともあなたがよく知っている方法の1つです。特定のスタイルとイディオムがあり、自分自身が陥りやすいと思うので、 Perl Best Practices (後でなくて早い)、 Perl Cookbook、 Second Edition を使用して、一般的な問題の解決方法を迅速に把握できます。

共有ホスティング環境でPerlがあまり使用されない理由は、セキュリティと設定の問題のために、歴史的にCGIの速度の低下とホストのインストールの不本意 mod_Perl が原因であると考えていますPHPより魅力的なオプション。その後サイクルが続き、より多くのホストがそれを提供したため、より多くの人がPHPを使用することを学びました。速度の違いとセキュリティの問題は、最近では FastCGI によって無意味になり、ほとんどの場合、PHPは、FastCGIのコアに残されるのではなく、同様にFastCGIを使い果たします。 Webサーバー。

これが事実であるかどうか、または他の理由があるかどうかにかかわらず、PHPは人気を博し、無数のアプリケーションがその中に書かれています。単純なブログまたはフォトギャラリーを備えたエントリーレベルのWebサイトが必要な人の大多数にとって、PHPが必要なだけなので、ホストはそれを促進します。必要に応じて、Perl(または他の選択したもの)の使用を妨げるものは何もありません。

エンタープライズレベルでは、実稼働環境でPHPが多すぎるとは思わないでしょう(そして、反例としてFacebookに誰も触れないでくださいenterpriseレベル)。

21
Duncan

Perlに関する私のお気に入りは、配列/リストの処理方法です。以下に、Perl関数(または「サブルーチン」)を作成して使用する例を示します。これは、引数にこれを使用します。

_sub multiply
{
    my ($arg1, $arg2) = @_; # @_ is the array of arguments
    return $arg1 * $arg2;
}
_

PHPでlist()を使って同様のことができますが、まったく同じではありません; Perlのリストと配列は実際には(通常)同じように扱われます。次のようなことを行います:

_$week_day_name = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")[$week_day_index];
_

そして、知っておくべきもう1つの違いは、数値/文字列比較演算子です。 Perlでは、_<_、_>_、_==_、_!=_、_<=>_などを使用すると、Perlは両方のオペランドを数値に変換します。代わりに文字列として変換する場合は、ltgteqnecmp(それぞれ前述の演算子と同等のもの)。これが本当にあなたを得る例:

_if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.
_
9
crimson_penguin

Perlは、Python and Rubyなど。以上。それは、PHPその中で最も重要な要素は、PHPの展開の容易さと、PHPの使いやすさです。

構文の違いはあまりにも多く、ここで要約することはできませんが、一般的に、より多くの表現方法があることは事実です(これはTIMTWOTDIとして知られています。

9
Leon Timmermans

私はoutisの素晴らしい答えに何も追加する必要はありません、私はあなたの質問の答えを表示したいだけです:

Perlが動的なWebサイトに使用されなくなったのはなぜですか?何がPHP=それよりも人気を得たのですか?

最初にいくつかの「ジョブトレンド」サイトを確認してください-そして、あなただけで判断を下すことができます。

ご覧のとおり、Perlは依然としてリーダーですが、おもちゃではなく実際のアプリケーションに適しています。 :)

4
jm666