我有一个
package Test; use Moose; has 'attr' => ( is => 'rw',isa => 'Str' );
在方法内部,我想在属性上应用s / pattern / string / g.由于Moose中记录的原因(基本上是为了正确支持多态)我不想直接访问$self-> {attr},所以很简单:
$self->{attr} =~ s/pattern/string/g;
不是一种选择.如何使用Moose在速度和清晰的代码中有效地执行此操作?
我想出的选项是:
1)使用临时变量和通常的getter / setter方法:
my $dummy = $self->attr; $dummy =~ s/pattern/string/g; $self->attr($dummy);
2)使用左侧的attr getter / setter:
$self->attr($dummy) =~ s/pattern/string/g;
但这显然会引发错误
Can’t modify non-lvalue subroutine call at Test.pm
line 58,line 29
有没有办法使用Moose访问器作为lvalue subs?
3)使用String traits
重新定义属性:
has 'attr' => ( is => 'rw',isa => 'Str',traits => ['String'],handles => { replace_attr => 'replace'} );
然后在方法中使用:
$self->replace_attr('pattern','string');
但是文档明确地说,没有办法指定/ g标志.
任何开箱即用的优雅,简单,有效的方法?