![画像](https://habrastorage.org/getpro/habr/post_images/ee1/6ce/04f/ee16ce04f0fb619eb4585b26b23cd874.png)
次のプログラムを/tmp/quine.plに保存します
Illegal division by zero at /tmp/quine.pl line 1.
コマンドで実行します
perl /tmp/quine.pl
彼女は自分のコードを出力します。
多くのプログラミング言語では、Quake-Tricksを作成するのは非常に簡単です。ソースの構文エラーは、プログラムのソースコードと一致するエラーを出力するパーサーを引き起こします。 次のようなトリックをTwitterに投稿しました 。
File "quine.py", line 1 File "quine.py", line 1 ^ IndentationError: unexpected indent
しかし、この記事の冒頭のパールオオムギは、まったく異なる種類のトリックです。プログラムは正しく理解しています。 そして、ゼロ除算のエラーにつまずくまで、それは長く働きません。 このクインはファイルの命名に非常に敏感です-たとえば、。/ quine.plを実行しても機能しません。
したがって、このエラーメッセージは実際にはプログラム全体ですか?!
このプログラムは、多くのパールバーdo-what-I-mean-parserを使用します。
記号/は、アプリケーションコンテキストに非常に依存しており、除算記号、または正規表現の始まりと見なすことができます。 また、このプログラムのコードにわずかな変更を加えても、コードの実行ではなく、規則性の解析でエラーが発生します。 この場合、両方の/文字が演算子のコンテキストに表示されます。
このプログラムの他の非辞書部分は
1.
これは、単に数字およびとして解釈され
.
これは連結演算子です。
それでは、その言葉の意味は何ですか?
Perlの単語は、ルーチン、メソッド、パッケージ、またはクラスの名前にすることができます。 または、(レイジーモードで)セパレーターのない行、または私が忘れていた何か他のものさえ!
Perlは、「 間接オブジェクト構文 」と呼ばれる次のような異常なメソッド呼び出し構文も使用します。
ほとんどの場合、あなたはどのように見ることができます
print $filehandle "message"; my $instance = new Class(args);
ただし、Perlの場合、次の構文が推奨されます。
$filehandle->print("message"); my $instance = Class->new(args);
perlobjのドキュメントには次のように書かれています:
Perlは、ヒューリスティックを使用して、知っているパッケージ名、現在のパッケージに存在するサブルーチン、前に出会った単語、および他の入力データを分析して、このコードを解析します。 言うまでもなく、ヒューリスティックは非常に予期しない結果をもたらす可能性があります!彼はこのコードをどのように解析しますか?
右側から開始
pl line 1.
メソッド呼び出しとして解析
line->pl(1.)
lineはパッケージ(クラス)の名前、plはメソッドです。
中央では、「at」、「tmp」、および「quine」は単純な単語として解析されます。 文字列。 式は次のように解析されます。
(("at" / "tmp") / "quine") . line->pl(1.)
左側には2つの折り畳まれた間接メソッド呼び出しがあり、
division->Illegal(zero->by( ... ))
最初に実行される内部式は次のとおりです。
"at" / "tmp"
そして、これは即座にゼロ除算例外を引き起こします。