我有一个Perl Moose对象,它包含一个我想在正则表达式中用作替换字符串的属性。想法是使用类似的东西:
$full_string =~ s{FIND_THIS}{$self->replace_string};
$self->replace_string
是要使用的Moose对象的属性。如上所述运行时,它无法按预期工作。正则表达式引擎认为'$ self'是变量而' - >'箭头只是一个字符串。替换为属性的值,替换的输出最终看起来像:
ObjectName=HASH(0x7ff458f70778)->replace_string
我知道解决这个问题的一个简单方法是将字符串放入一个新变量中。例如:
my $new_replace_string = $self->replace_string;
$full_string =~ s{FIND_THIS}{$new_replace_string};
我的问题是,是否有办法避免创建新变量并直接使用对象的属性。 (理想情况下,无需添加一行代码。)这可能吗?
答案 0 :(得分:4)
最直接的方法是告诉Perl替换表达式是要评估的Perl代码。替换值将是该代码返回的值。
$full_string =~ s{FIND_THIS}{$self->replace_string}e;
但是有一个技巧可以将表达式的结果插入到字符串文字中(这是替换表达式)。
$full_string =~ s{FIND_THIS}{${\( $self->replace_string )}/;
或
$full_string =~ s{FIND_THIS}{@{[ $self->replace_string ]}/;
这个想法是创建一个引用并使用dereference对其进行插值。在第一个中,表达式在标量上下文中进行评估。在后者中,在列表上下文中。
答案 1 :(得分:2)
/e
评估s ///的右侧作为表达式:
$full_string =~ s/FIND_THIS/$self->replace_string/e;
答案 2 :(得分:1)
是的,您可以抛出eval switch(/e
)。
$full_string =~ s{FIND_THIS}{$new_replace_string}e;