1

ウィキペディアによると:

クワインは、入力を受け取らず、唯一の出力として独自のソース コードのコピーを生成する、空でないコンピューター プログラムです。

私はこの perl コードを見ましたが、それがどのように機能するのか理解できません。

次の行をファイルに保存し、ファイルを次のよう/tmp/pに実行しますperl /tmp/p

Illegal division by zero at /tmp/p line 1.

perl /tmp/p の出力は次のとおりです。

Illegal division by zero at /tmp/p line 1.

コードはどのように機能していますか?

4

2 に答える 2

7

まず、警告をオンにして実行してみます。

$ perl -wp
引用符で囲まれていない文字列 "at" は、p 行 1 で将来の予約語と競合する可能性があります。
引用符で囲まれていない文字列 "tmp" は、p 行 1 で将来の予約語と競合する可能性があります。
引数 "tmp" は、p 行 1 の除算 (/) で数値ではありません。
p 行 1 の除算 (/) で、引数 "at" が数値ではありません。

最初の 2 つの警告は、コンパイル フェーズからのものです。

Deparse出力を見てみましょう。

$ perl -MO=Deparse p
'division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));
p 構文 OK

基本的に、別のメソッド呼び出しの戻り値で割った値はat、クラスで呼び出されたメソッドに引数として渡されます。およびは文字列と見なされ、その数値はゼロです。したがって、不正なゼロ除算エラーが発生します。tmppby'zero'attmpat/tmp

ファイルの内容を次のように変更すると、同じエラーが発生します。

Stackoverflow hacker news one at /tmp/p line 1.

がどうIllegal divisionなるか疑問に思っている場合は、間接オブジェクト構文'division'->Illegalを参照し、使用を避けてください

于 2015-11-29T13:34:14.010 に答える
-1

わかりにくい部分を調査するよりも、Perl コードの品質を向上させることに専念していただきたいと思います。

しかし、答えは、行が次のように解析されるということです

'division'->Illegal('zero'->by('at' / 'tmp' / 'line'->p(1)));

Perl は'at'andにゼロを使用します'tmp'。これは、有効な数値文字列ではないためです。したがって、最初のアクションは、0 / 0どれがエラーをスローするかを評価することです。

于 2015-11-29T13:36:59.010 に答える