1

$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
4

2 に答える 2

2

/e$replacementPerl コードとして扱います。Perl コード$replacementは、含まれている値を単純に返します。

の内容$replacementPerl コードとして評価したい場合は、

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
于 2013-05-01T21:12:56.380 に答える
2

コードで次の変更を行う必要があります。

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

詳細については、このSOの回答を参照してください

于 2013-05-01T20:10:30.600 に答える