argius note

プログラミング関連

演算子オーバーロード

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) ?
$

参考

Googleブック検索で見つかりました。肝心なところが読めない.....

プログラミングPerl - Google ブックス