関数の再定義


関数の再定義


関数を再定義するサンプルを作ってみました。

まず、

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]

のようになります。

用途としてどのようなものがあるのかよくわかりません。

Task Runner