gpt4 book ai didi

perl - 如何有效地对 Moose 属性应用正则表达式替换?

转载 作者:行者123 更新时间:2023-12-04 22:58:53 24 4
gpt4 key购买 nike

我有一个

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 - 如何有效地对 Moose 属性应用正则表达式替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32719874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com