[kansaipm] self.pl

Yasushi Nakajima sey at jkc.co.jp
Sat Apr 21 06:40:26 CDT 2001


 今日は、懇親会に参加できずに残念でした。いまはまだ盛り上がってる最中か
な?

 さて、今日のクイズの中で、実行するとそのスクリプトファイルをcatあるい
はtypeするのと同じ表示をするスクリプトを作れ、というのがありました。非常
にトリッキーな回答である「空のスクリプト」というのは別として、

1)もっとも素直な回答
  open(F,$0);print <F>;close(F);

2)少しずぼらをした回答
  @ARGV=$0;print<>;

というのが今日の会場で出された回答かと思います。その後、帰りの京阪の中で
考えた結果、次の毛色の変わった答えを得ました。

3)callerを使った回答
  eval q(print 'eval q(',(caller(0))[6],');';);

 ただしこの3)は、残念ながらPerl4では動きません。5.00503と5.6.0で確認し
ましたが、すべてのPerl5で動くかどうかは保証の限りではありません。

 callerは、evalされた文字列の中で、引数付きで呼び出されると、7つ目の返
値としてevalされた文字列自身を返すという隠し機能(?)があります。今回の
問題のポイントは、Perlのスクリプト実行中に、どうやって実行されているスク
リプトの内容を文字列として得るか、というところにあります。スクリプトファ
イルを読みとる(つまり上記の1)や2)の方法)以外には、このcallerの7番目の
返値を使うしか方法はないように思います。もしこれ以外の方法があればぜひ教
えてください。

中島 靖




More information about the Kansai-pm mailing list