電子書籍の厳選無料作品が豊富!

Perlのコードを動かしながら勉強していて、ふと納得いかない点があったので教えてください。

次のコードを実行すると'0'と表示されます。

Cls->new;
package Cls;
sub new {bless([])}
sub AUTOLOAD {print(0)}

つまりAUTOLOADサブルーチンが実行されているようです。
しかし私のコードの中ではAUTOLOADサブルーチンの定義はしているものの、どこからも呼び出していません。

このコードは何も行わずに終了するはずなのですが、そうではありませんでした。
AUTOLOADサブルーチンは、いつ、どこで、何者によって呼び出されるのでしょうか。

A 回答 (4件)

DESTROYを呼ぼうとして、DESTROYが存在しないのでAUTOLOADを呼びました。


オブジェクトが参照されなくなり、オブジェクトが破棄されるときDESTROYが呼ばれます。
    • good
    • 0
この回答へのお礼

なるほど!

このコードではnewの結果をすぐさま捨てているので、
DESTROYが呼ばれるのはnewを実行した直後ですね。

もし私がnewの後に何かコードを書いていれば、どのタイミングで'0'が表示されるかは調べられましたね^^;

お礼日時:2011/07/12 09:56

ちと調べてみると, our は 5.6.0 で入ったようですね. 5.6.0 のリリースは 2000年の 5月. おお, 前世紀なのか.


ちなみに今の最新は 5.14.1.
    • good
    • 0
この回答へのお礼

おっと、この本は中古で入手したので、
私のPerlの勉強が10年以上滞っているとは考えないでいただきたい!!!
せいぜい6~7年です^^;

お礼日時:2011/07/13 16:40

ちなみに


sub AUTOLOAD { our $AUTOLOAD; print "$AUTOLOAD\n"; }
としておけば「何が足りなかったのか」はわかります.
    • good
    • 0
この回答へのお礼

AUTOLOADに実際に呼び出されたサブルーチン名を報告させるのですね;

ところで私の本はだいぶ時代遅れになってしまいました。
この本にはPerlの全関数が載っているはずなのですがourは載っていませんでした。
この関数は初めて知りました^^;

お礼日時:2011/07/12 20:12

ちょっと調べた.



参考URL:http://d.hatena.ne.jp/okamuuu/20100429/1272507611
    • good
    • 0
この回答へのお礼

なるほど!

クラスにはDESTROYというサブルーチンを用意しないといけないのですね。
それが無かったもんだからPerlが仕方なくAUTOLOADを呼んだのですね。

お礼日時:2011/07/12 09:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!