gpt4 book ai didi

Perl 在变量插值的替换中使用 $1

转载 作者:行者123 更新时间:2023-12-03 09:27:57 25 4
gpt4 key购买 nike

我正在尝试在替换字符串中使用变量插值,包括 $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

最佳答案

/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

关于Perl 在变量插值的替换中使用 $1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16325464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com