PerlとPHPの違い[終了]


101

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

PHPが「Perlハック」のセットとして始まったとき、PHPは明らかにいくつかのPerl機能のクローンを作成しました。

  • 構文の主な違いは何ですか?Perlでは、何かを表現するためのオプションや方法が増えるのは本当ですか?

  • Perlが動的Webサイトで使用されなくなったのはなぜですか?PHPの人気が高まった理由は何ですか?


2
気になるので、私は尋ねなければなりません。PHPに続いて第2言語を自由に選択できるなら、なぜより現代的なPythonやRubyではなくPerlを選ぶのでしょうか。
jholster 2010年

37
PythonとRubyがよりモダンになるための基礎は何ですか?
ジョシュアパルトギ

2
私は人々が言語を比較することを試みるべきではないと思います。混乱を招くだけです。
Ben Shelock

11
@ベン:構文を比較することの有用性は限られています。機能の比較は、新しい言語の学習に役立ちます。
outis

1
私は、すべての言語が、デザイナーがそのために構想したことに基づいて、その強さを持っていると信じています。特に一連の使用例に基づいています。したがって、言語を比較することはしばしばバイアスと混乱を招きます
CodeAngel 2013年

回答:


284

PerlとPHPは似ています。Perl 6はまだ開発中であるため、Perl 5について考えてみましょう。主題ごとに大まかにグループ化されたいくつかの違い:

  • Perlは、正規表現リテラルを含むネイティブの正規表現をサポートしています。PHPは、Perlのregexp関数を拡張として使用します。
  • Perlには、マッチング(、)、引用符のような(、&c。)、指数()、文字列反復()、範囲(および)など、かなり多くの演算子があります。PHPには、Perlにはないいくつかの演算子があります。たとえば、エラー抑制演算子()などです(Perlにはメソッドがあります)。=~!~qwqx**x.....@instanceofUniversal::isacloneます。
  • PHPでは、newです。Perlでは、これはパッケージで定義されたオブジェクト作成サブルーチンの従来の名前であり、言語に関する限り、特別なことは何もありません。
  • Perlの論理演算子は引数を返しますが、PHPではブール値返します。試してください:

    $foo = '' || 'bar';

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

  • Perlの変数名は、内蔵示すPerlが3つあり、型指定は、(「と呼ばれる名前の一部であるタイプ、シギル」)ので、$foo別の変数は、以下です@fooか、%foo
  • (前のポイントに関連して)Perlには、スカラー、配列、ハッシュ、コード、ファイル/ディレクトリハンドル、およびフォーマット用の個別のシンボルテーブルエントリがあります。それぞれに独自の名前空間があります。
  • Perlはシンボルテーブルへのアクセスを提供しますが、それを操作するのは心臓の弱い人のためではありません。PHPでは、シンボルテーブルの操作は、参照extract関数の作成に限定されています。
  • 「参照」は、PHPとPerlでは異なる意味を持つことに注意してください。PHPでは、参照はシンボルテーブルのエイリアスです。Perlでは、参照はスマートポインタです。
  • Perlには、整数インデックス付きコレクション(配列)と文字列インデックス付きコレクション(ハッシュ)のさまざまなタイプがあります。PHPでは、これらは同じタイプ、つまり連想配列/順序付きマップです。
  • Perlの配列はまばらではありません。現在の配列のサイズよりも大きいインデックスを持つ要素を設定すると、介在するすべての要素が設定されますundefinedperldataを参照)。PHPの配列はまばらです。要素を設定しても、間にある要素は設定されません。
  • Perlはハッシュスライスと配列スライスをネイティブでサポートしており、スライスは割り当て可能であり、あらゆる用途があります。PHPでは、を使用array_sliceしてスライスを抽出し、スライスarray_spliceに割り当てます。
  • ちょっとした魔法のために、PHP の添え字演算子の引数を省略できます。Perlでは、添え字を省略できません。
  • Perlハッシュは順不同です。
  • Perlには、多数の定義済みの魔法の変数があります。PHPの定義済み変数の目的はまったく異なります。
  • Perlにはステートメント修飾子があります。一部の制御ステートメントはステートメントの最後に置くことができます。
  • Perlは、キーワードによる動的スコープをサポートしていますlocal
  • さらに、Perlにはグローバル、字句(ブロック)、およびパッケージのスコープがあります。PHPには、グローバル、関数、オブジェクト、クラス、名前空間のスコープがあります。
  • Perlでは、変数はデフォルトでグローバルです。PHPでは、関数の変数はデフォルトでローカルです。
  • Perlは、関数を介した明示的な末尾呼び出しをサポートしていgotoます。
  • Perlのプロトタイプは、PHPの型ヒントよりも、関数の引数の型チェックを制限しています。その結果、プロトタイプはタイプヒントよりも用途が制限されます。
  • Perlでは、returnステートメントが使用されていない場合でも、ステートメントが式である(つまり、値がある)場合、最後に評価されたステートメントがサブルーチンの値として返されます。ループなど、最後のステートメントが式ではない(つまり、値がない)場合、戻り値は指定されていません(perlsubを参照)。PHPでは、明示的な戻り値がない場合、戻り値は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が有する特殊コードブロックをBEGINUNITCHECKCHECKINITEND)実行されます。PHP auto_prepend_fileやとは異なりauto_append_file、各タイプのコードブロックの数に制限はありません。また、コードブロックはスクリプト内で定義されますが、PHPオプションはサーバーおよびディレクトリごとの構成ファイルで設定されます。
  • Perlでは、セミコロンでステートメントを区切ります。PHPでは、PHP終了タグ( "?>")もステートメントを終了できることを除いて、それらを終了します。
  • Perlの式の値は状況依存です。
  • Perlの負の添え字は、配列の末尾を基準にしています。$bam[-1]配列の最後の要素です。PHPの負の添え字は、他の添え字と同じです。
  • Perl 5では、クラスはパッケージに基づいており、PHP(または他のほとんどの言語)のクラスのようには見えません。Perl 6クラスはPHPクラスに近いですが、それでもかなり異なります。(Perl 6は他の多くの点でPerl 5 とは異なりますが、それは話題外です。)Perl 5とPHPの違いの多くは、OO機能のほとんどがPerlに組み込まれておらず、ハックに基づいているという事実から生じます。たとえば、の$obj->method(@args)ようなものに翻訳されます(ref $obj)::method($obj, @args)。非網羅的なリスト:
    • PHPは、$thisメソッドに特別な変数を自動的に提供します。Perlはオブジェクトへの参照を最初の引数としてメソッドに渡します。
    • Perlはオブジェクトを作成するために祝福される参照を必要とします。すべての参照は、特定のクラスのインスタンスとして祝福されます。
    • Perlでは、packages @ISA変数を使用して継承を動的に変更できます。
  • Perlは演算子のオーバーロードをサポートしています。
  • 厳密に言えば、Perlには複数行のコメントはありませんが、PODシステムを使用して同じ効果を得ることができます。
  • Perlでは、//は演算子です。PHPでは、1行コメントの始まりです。
  • PHP 5.3まで、PHPは匿名関数(create_function関数)をひどくサポートし、クロージャーをサポートしていませんでした。
  • 名前空間が導入されたバージョン5.3まで、PHPにはPerlのパッケージのようなものがありませんでした。
  • 間違いなく、Perlの組み込みの例外サポートは、他の言語の例外とほとんど同じように見えないため、例外のようには見えません。ブロックを評価し、$@(のeval代わりにtry、のdie代わりにthrow)の値をチェックします。エラー 試し::タイニーあなたが他の言語でそれらを見つけるように、モジュールがサポートする例外(同様に記載されているいくつかの他のモジュールのエラーの関連項目を参照)。

PHPは、Phantom of the ParadisePhantom of the Operaに、またはStrange BrewHamletに触発されたのと同じ方法で、Perl に触発されました。Perlを学習するときは、PHPの動作の詳細を頭に入れておかないようにするのが最善です。そうしないと、つまずきます。

今は頭が痛いのでやめます。


21
これは素晴らしい答えであり、私はそれに小さなちっぽけなことをするのは気分が悪いですが、Perl配列については大体正しいだけです。あなたが持っているときに@array = qw(a b c)、あなたがやる$array[4] = 'e'、配列の内容は正確ではありません('a', 'b', 'c', undef, 'e')。彼らがしている('a', 'b', 'c', 、存在しません'e')。つまり、[3]スロットはundefであるスカラーへのポインターを保持しません。それは何も保持していません(そしてexistsオペレーターはこれをテストします)。小さな違いですが、違いがあります。:)
ホッブ

9
男、これは私が今まで見た中で最高の答えの一つです。特にインスピレーションに関する部分。単に:クールで真実。;)
jm666

2
値を設定するための最短の道$fooがまだ設定されていない場合であってもよいisset($foo) || $foo='default';
alexbusu

45

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

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

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


21

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

<不完全な理由をここに挿入>するため、PHPはPerlより優れています。

ilk、そしてめったに妥当な比較をしません。

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

$string = trim($string);

Perlではそれはやや不可解です

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

(これは、単一行のキャプチャと置換よりも少し効率的で、少し理解しやすいと思います。)ただし、PHPは英語に似ていることが多いですが、低レベルCのラッパーとしてルーツが表示される場合があります。例えば、strpbrkそしてstrspnほとんどのPHPのdabblersではなく、マニュアルを探索時間を費やすよりも、あまりにも難解な何のために自分の同等の機能を書くので、おそらくめったに使用されません。誰もがPerlのようなものに平等に取り組み、ゼロから学ぶ必要があるため、英語が第二言語であるプログラマーについても疑問に思います。

私はすでにマニュアルについて述べました。PHPにはすばらしいオンラインマニュアルがありますが、残念ながら必要です。パラメータの順序や関数の命名規則など、単純である必要があるものについては、時々参照します。Perlで、あなたはおそらく、あなたが手動のAを参照しているでしょう多くのあなたが始めると、その後一日、あなたは持っていますA-haの瞬間をし、再びそれを必要はありません。まあ、少なくともあなたがより高度になり、複数の方法があるだけでなく、おそらくより良い方法があること、他の誰かがおそらくそのより良い方法ですでにそれを行っていること、そしておそらくCPANにアクセスする必要があることに気付くまでは、そうではありません。

Perlには、物事を表現するための多くのオプションと方法があります。これは必ずしも良いことではありませんが、賢く使用すれば、コードを読みやすくすることができます。自分が陥り がちな特定のスタイルやイディオムがあります。一般的な問題をすばやく解決するためにPerlのベストプラクティス (後でではなく、すぐに)とPerlクックブック第2版を読むことを強くお勧めします。

共有ホスティング環境でPerlがあまり使用されない理由は、これまでCGIの認識された速度低下と、セキュリティと構成の問題のためにホストがmod_perlをインストールすることを望まないことがPHPをより魅力的なオプションにしたためだと思います。その後、サイクルが続き、より多くのホストがPHPを提供するようになったため、より多くの人々がPHPの使い方を学びました。速度の違いとセキュリティの問題は、最近FastCGIによって疑わしくなっています。ほとんどの場合、PHPはWebサーバーのコアに残されるのではなく、FastCGIも実行されます。

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

エンタープライズレベルでは、本番環境でPHPが多すぎるとは思えません(Facebookの反例として、誰も指摘しないでください。エンタープライズレベルだと言っています)。


2
幸いなことに、mod_perlの複雑化なしに適切なパフォーマンスを提供するFastCGIホスティングを使用してホスティングを取得することがより簡単になっています。
Quentin

@David Dorward:わかりました。FastCGIはmod_phpよりも優れたパフォーマンス/セキュリティも提供するため、私は歴史的な意味で話していました。少しわかりやすくするために編集します。
ダンカン

3
あなたのトリムの例は意味がありません。いただきまし良好4つのオペレータ又はEREG ereg_replace eregi eregi_replace mb_ereg mb_ereg_replace mb_eregi mb_eregi_replaceするpreg_match preg_match_allにpreg_replace str_replace str_ireplaceはstrstr stristr strrchr strpos striposのstrrpos strripos mb_strpos mb_strrposなどのすべてのPHP関数の一貫性のないパラメータと戻り値の全て覚える
Myforwik

3
あなたのPerlトリムの例はもっと簡単かもしれません:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo '22

1
@Myforwik、私のトリムの例は、Perlに明らかな機能がないことを実証することを目的としており、初心者には混乱を招く可能性があります。構文を学べば、はい、すべての不整合に対処するよりもはるかに簡単です。私は、マニュアルを常に必要とすることについてもその点を述べました。
ダンカン

9

PerlはWebサイトで多く使用されています。たとえば、PythonやRuby以上です。とはいえ、PHPは他のどれよりも頻繁に使用されています。その中で最も重要な要素は、PHPのデプロイメントの容易さ、およびPHPの使いやすさです。

構文の違いは多すぎてここで要約することはできませんが、一般的には、自分を表現する方法が多いのは事実です(これはTIMTWOTDIと呼ばれ、実行する方法は1つではありません)。


9

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.

配列とリストは通常同じように扱われます。
Brad Gilbert、

そうですね。そう言うつもりだったと思いますが、忘れました。それを反映するように編集されました。
crimson_penguin 2010年

4

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

Perlが動的Webサイトで使用されなくなったのはなぜですか?PHPの人気が高まった理由は何ですか。

最初にいくつかの「Job Trends」サイトを確認してください-一人で判断できます。

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


1
この比較も興味深いと思います。www.simplyhired.com/ a / jobtrends / trend / q
Sorin Postelnicu

1
固定リンク切れ、PLEASE使用:simplyhired.com/...
R4。

SH.com/a/jobtrendsは存在しないようです。使用してください:simplyhired.com/search?q
r4。

@ r4.yourリンクは元の(現在は壊れている)リンクと同じではありません。元のグラフには、上記のようなグラフが表示され、一部のジョブリストは表示されません。求人情報のリンクは範囲外です。
jm666
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.