perl – 如何在Moose属性上有效地应用正则表达式替换?
发布时间:2020-12-15 23:22:36 所属栏目:大数据 来源:网络整理
导读:我有一个 package Test;use Moose;has 'attr' = ( is = 'rw',isa = 'Str' ); 在方法内部,我想在属性上应用s / pattern / string / g.由于Moose中记录的原因(基本上是为了正确支持多态)我不想直接访问$self- {attr},所以很简单: $self-{attr} =~ s/pattern/s
我有一个
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; 但这显然会引发错误
有没有办法使用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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |