1

我有一个 Perl Moose 对象,其中包含我想在正则表达式中用作替换字符串的属性。这个想法是使用类似的东西:

$full_string =~ s{FIND_THIS}{$self->replace_string};

Moose 对象的属性在哪里$self->replace_string使用。如上所述运行时,它不能按预期工作。正则表达式引擎认为 '$self' 是变量,而 '->' 箭头只是一个字符串。而不是属性的值,替换的输出最终看起来像:

ObjectName=HASH(0x7ff458f70778)->replace_string

我知道克服这个问题的一个简单方法是将字符串放入一个新变量中。例如:

my $new_replace_string = $self->replace_string;
$full_string =~ s{FIND_THIS}{$new_replace_string};

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

4

3 回答 3

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 ]}/;

这个想法是创建一个引用并使用解引用对其进行插值。首先,表达式在标量上下文中求值。在后者中,在列表上下文中。

于 2012-06-14T17:03:37.980 回答
2

/e将 s/// 的右侧评估为表达式:

$full_string =~ s/FIND_THIS/$self->replace_string/e;
于 2012-06-14T16:45:16.147 回答
1

是的,您可以抛出eval开关( /e)。

$full_string =~ s{FIND_THIS}{$new_replace_string}e;
于 2012-06-14T16:46:02.803 回答