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";

我还添加strictwarnings帮助自己避免常见的陷阱。

于 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 回答