У меня естьКак эффективно применять замену регулярных выражений по атрибуту Moose?
package Test;
use Moose;
has 'attr' => (is => 'rw', isa => 'Str');
Внутри метода я хотел бы применить s/pattern/string/g
на атрибут. По причинам, документированных в Мус (в основном правильно поддерживать полиморфизм) Я не хочу, чтобы получить доступ к $self->{attr}
непосредственно, так просто:
$self->{attr} =~ s/pattern/string/g;
не вариант. Как я могу сделать это эффективно в скорости и небольшом, но понятном коде с Moose?
Опции я придумал являются:
1) С помощью временной переменной, а обычный метод геттер/сеттер:
my $dummy = $self->attr;
$dummy =~ s/pattern/string/g;
$self->attr($dummy);
2) Использование атр геттер/сеттер на левой стороне :
$self->attr($dummy) =~ s/pattern/string/g;
Но это, очевидно, выдает ошибку
Невозможно изменить без Lvalue вызова подпрограммы на Test.pm линию 58, строка 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
флаг.
Любой элегантный, простой, несколько эффективный метод, доступный из коробки?
Связанный: [Правильный способ использования атрибута класса Moose в регулярном выражении?] (Http://stackoverflow.com/q/32613115/176646) – ThisSuitIsBlackNot
Зачем вы хотите это сделать? Может быть, реализовать его как модификатор 'around' для автора или как триггер, имеет больше смысла, чем его где-то еще? – simbabque
Если аксессор был подмножеством lvalue, он мог бы эффективно получить доступ к '$ self -> {attr}' непосредственно, если не были созданы магические значения возврата, замедляя каждый доступ к каждому доступному ему не нужно. – ikegami