まず、警告をオンにして実行してみます。
$ 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
、クラスで呼び出されたメソッドに引数として渡されます。およびは文字列と見なされ、その数値はゼロです。したがって、不正なゼロ除算エラーが発生します。tmp
p
by
'zero'
at
tmp
at/tmp
ファイルの内容を次のように変更すると、同じエラーが発生します。
Stackoverflow hacker news one at /tmp/p line 1.
がどうIllegal division
なるか疑問に思っている場合は、間接オブジェクト構文'division'->Illegal
を参照し、使用を避けてください。