関数の再定義
関数を再定義するサンプルを作ってみました。
まず、
package M;
use Data::Dumper;
sub new {
my $class = shift;
my $self = { @_ };
bless($self, $class);
# $self->_init();
return $self;
}
sub a {
print "** original\n";
my $self = shift;
my $chr = shift;
printf "** (%s)\n", join(',', caller(0));
printf "** chr=[%s]\n", $chr;
print "[caller]\n".Dumper(caller)."[/caller]\n";
print "\n";
}
1;
のようにモジュールを作成し、メインプログラムに、
use M;
my $m = new M;
$m->a("O"); # 関数呼び出し
# このあと関数の上書き
package M;
sub a {
print "** overwrite\n";
my $self = shift;
my $chr = shift;
printf "** (%s)\n", join(',', caller(0));
printf "** chr=[%s]\n", $chr;
print "\n";
}
のように関数M::aを再定義したプログラムを作成しました。
実行してみると、
** overwrite
** (main,z.pl,6,M::a,1,,,,256,,)
** chr=[O]
のようになり、ちなみに再定義前では、
** original
** (main,z.pl,6,M::a,1,,,,256,,)
** chr=[O]
[caller]
$VAR1 = 'main';
$VAR2 = 'z.pl';
$VAR3 = 6;
[/caller]
のようになります。
用途としてどのようなものがあるのかよくわかりません。