演算子オーバーロード
overload - Perl の演算子のオーバーロードを行うパッケージ(perldoc.jp)
こんなのがあったんですね。perldoc一覧のインデックスで見たことはあったのかも知れません。必要なかったので、スルーしてました。
今回、なんとなく遊んでみたのでここに置いておきます。
課題は、"$d = $a"がリファレンスのコピーになっているのを、コピーコンストラクタを呼べるようにするところです。ここがまだちょっと良く分かりません。
コード
package Number; use overload "+" => \&operator_add, "0+" => sub { shift->[0] }, '""' => sub { shift->[0] . "(" . __PACKAGE__ . ")" }; sub new { my $self = shift; bless [@_], $self } sub operator_add { my $self = shift; my $b = shift; $b = $b->[0] if ref $b eq __PACKAGE__; $self->[0] .= "+" . $b; return $self; } package main; my $a = new Number 5; my $b = new Number 3; print " $a + $b = ", ($a + $b), " ? \n"; ++$a; print " incr \$a = $a\n"; ++$a; print " incr \$a = $a\n"; print "\n"; my $d = $a; print " \$d = $d\n"; ++$d; print " incr \$d = $d\n"; print " \$a = $a\n"; print " $d + $b = ", ($d + $b), " ? \n";
実行結果
$ perl -v This is perl, v5.8.7 built for cygwin-thread-multi-64int (with 1 registered patch, see perl -V for more detail) (中略) $ perl test.pl 5(Number) + 3(Number) = 5+3(Number) ? incr $a = 5+3+1(Number) incr $a = 5+3+1+1(Number) $d = 5+3+1+1(Number) incr $d = 5+3+1+1+1(Number) $a = 5+3+1+1+1(Number) 5+3+1+1+1(Number) + 3(Number) = 5+3+1+1+1+3(Number) ? $