【问题标题】:Perl using $1 in a substitution replacement with variable interpolationPerl 使用 $1 进行变量插值替换
【发布时间】:2013-05-02 05:12:56
【问题描述】:

我正在尝试在替换字符串中使用变量插值,包括$1$2、... 但是,我无法将 $1 扩展为替换。我最终将拥有 $pattern$replacement 变量可以从配置文件中读取,但即使 手动设置它们不起作用。

在示例脚本中,您可以看到$1(应该是'DEF')不是 在$new_name 中展开,但它在$new_name2 中(没有变量)。

在替换中添加一个“e”标志没有帮助。

我该如何解决这个问题?

马特

示例代码:

#!/usr/local/bin/perl
use strict;

my $old_name = 'ABC_DEF_GHI';

my $pattern = 'ABC_(...)_GHI';
my $replacement = 'CBA_${1}_IHG';

# using variables - doesn't work
my $new_name = $old_name;
$new_name =~ s|$pattern|$replacement|;

printf("%s --> %s\n", $old_name, $new_name);


# not using variables - does work
my $new_name2 = $old_name;
$new_name2 =~ s|ABC_(...)_GHI|CBA_${1}_IHG|;

printf("%s --> %s\n", $old_name, $new_name2);

输出:

ABC_DEF_GHI --> CBA_${1}_IHG
ABC_DEF_GHI --> CBA_DEF_IHG

【问题讨论】:

标签: perl variables interpolation


【解决方案1】:

您需要在您的代码中进行此更改:

my $replacement = '"CBA_$1_IHG"';  #note the single and double quotes
# ...
$new_name =~ s|$pattern|$replacement|ee;  #note the double "ee", double evaluation

See this SO answer了解更多信息

【讨论】:

【解决方案2】:

/e$replacement 视为 Perl 代码。 Perl 代码$replacement 只返回它包含的值。

如果你想将$replacement内容评估为Perl代码,你需要

s/$search/ my $s = eval $replacement; die $@ if $@; $s /e

可以写成

s/$search/$replacement/ee

请注意,由于$replacement 应该包含 Perl 代码,这意味着它可以用于执行任意 Perl 代码。

更好的解决方案是意识到您正在编写自己的低于标准的模板系统,并改用现有的。 String::Interpolate 了解您当前使用的模板语法:

use String::Interpolate qw( interpolate );
s/$search/interpolate $replace/e

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多