perl – 如何在Moose属性上有效地应用正则表达式替换?

前端之家收集整理的这篇文章主要介绍了perl – 如何在Moose属性上有效地应用正则表达式替换?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个

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标志.

任何开箱即用的优雅,简单,有效的方法

解决方法

我过去曾使用过这种方法,我觉得在效率和清洁度方面似乎适合我.它也适用于/ g修饰符.

$self->attr( $self->attr =~ s/pattern/string/gr );

我怀疑在引擎盖下这与你的第一个临时变量示例相同,它只是对我们隐藏.

请注意,要使用/ r修饰符,它返回替换结果而不修改原始值,需要Perl 5.14.

猜你在找的Perl相关文章