0

このコードを使用して、正規表現の一致によって文字列を変更しています。

$a->{'someone'} = "a _{person}";
$a->{'person'} = "gremlin";

$string = "_{someone} and a thing"
while($string =~ /(_\{(.*?)\}/g){
    $search = metaquote($1);
    $replace = $a->{$2};
    $string =~ s/$search/$replace/;
}

結果は次のa _{person} and a thingとおりですが、私は期待しています: a gremlin and a thing.

これを機能させるにはどうすればよいですか?

4

3 に答える 3

4

関数はquotemetaではなくで呼び出されmetaquoteます。また、正規表現に右括弧がありません:

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

my $a;

$a->{'someone'} = "a _{person}";
$a->{'person'}  = "gremlin";

my $string = "_{someone} and a thing";
while($string =~ /(_\{(.*?)\})/g){
    my $search  = quotemeta($1);
    my $replace = $a->{$2};
    $string =~ s/$search/$replace/;
}
print "$string\n";

また、一般的な落とし穴を回避するために と も追加strictしました。warnings

于 2013-03-19T21:07:22.413 に答える
2

これはより効率的なバリアントであるべきだと思います:

use strict;
my $a;
$a->{'someone'} = "a _{person}";
$a->{'person'} = "gremlin";

my $string = "_{someone} and a thing";
while( $string =~ s/(_\{(.*?)\})/ $a->{$2} /ges ) {}
print $string."\n";
于 2013-03-19T21:14:39.203 に答える
0

この亜種は、文字列内のすべてのプレースホルダーを対応するハッシュ値に置き換えて、なくなるまで繰り返します。

さらに、aはどの変数の識別子としても不適切であるため、 という名前を付けましたtokens

use strict;
use warnings;

my %tokens = (
  someone => 'a _{person}',
  person  => 'gremlin',
);

my $string = '_{someone} and a thing';

1 while $string =~ s/_\{([^}]+)\}/$tokens{$1}/g;

print $string, "\n";

出力

a gremlin and a thing
于 2013-03-19T21:23:58.450 に答える