perl – 为什么“use overload”与“use namespace:autoclean”一起使用?

好吧,只是为了健康检查超载似乎没有为我工作.我不知道是否是perl的版本,或者是overload.pm的版本,或者我实现它的方式有问题,但是这个代码对我来说不行.

perl版本

This is perl,v5.10.1 (*) built for x86_64-linux-gnu-thread-multi

过载版本

perl -Moverload -e 'print "$overload::VERSION\n";'
1.07

Token.pm

package Token;
use namespace::autoclean;
use Data::Dumper;


use Moose;
use Moose::Util::TypeConstraints; 

use overload '+' => \&_overload_add,fallback => 1;

  has 'secretvalue' => ( is => 'rw',isa => 'Int');  

  sub _overload_add{
    my ( $one,$two ) = @_;   
    my $value = $one->secretvalue() + $two->secretvalue();
    return ($value);
  }

主要

use strict;
use warnings;
use Token;
my $t = Token->new( secretvalue => 17,key => 'x' );
my $t2 = Token->new( secretvalue => 12,key => 'y' );

my $x = $t + $t2;

print $x;

版画

$VAR1 = 12900840;

最糟糕的是,我没有在日志中收到任何类型的警告或错误.

UPDATE

感谢Freido找到问题.我已经更新了这个问题,以防万一有人绊倒.

Perl / Moose社区一般不会使用超载吗?

解决方法

命名空间:: autoclean是与过份加法来处理您的运算符的魔力.以下工作原理如您所料:
package Token;

use Moose;
use Moose::Util::TypeConstraints;

use overload '+' => '_overload_add';

has 'secretvalue' => ( is => 'rw',isa => 'Int');

sub _overload_add{
    my ( $one,$two ) = @_;
    my $value = $one->secretvalue() + $two->secretvalue();
    return ($value);
}

1;

偶然的一瞥在命名空间中没有显示任何东西:: autoclean docs解决这个问题,所以我想这是一个意想不到的功能.有些搜索显示有一个bug已被报道.

我想这是减少重载添加到你的包的特殊符号.重载会添加符号表条目(),(和OVERLOAD.我猜想这些条目中的一些或全部都是由namespace :: autoclean进行抽真空的,因此可以撤销你的重载.

如果你觉得冒险,here’s a patch为namespace :: autoclean过滤掉过载符号.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...