有没有办法直接在Perl正则表达式替换中使用对象的属性?

时间:2012-06-14 16:41:29

标签: regex perl moose

我有一个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};

我的问题是,是否有办法避免创建新变量并直接使用对象的属性。 (理想情况下,无需添加一行代码。)这可能吗?

3 个答案:

答案 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;