Regex Perl:通过正则表达式匹配更改字符串
我正在使用此代码通过正则表达式匹配来更改字符串Regex Perl:通过正则表达式匹配更改字符串,regex,perl,Regex,Perl,我正在使用此代码通过正则表达式匹配来更改字符串 $a->{'someone'} = "a _{person}"; $a->{'person'} = "gremlin"; $string = "_{someone} and a thing" while($string =~ /(_\{(.*?)\}/g){ $search = metaquote($1); $replace = $a->{$2}; $string =~ s/$search/$replac
$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/;
}
结果是一个{code>person}和一件事,但我期待着:一个小精灵和一件事
如何使其工作?该函数称为
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
,以帮助自己避免常见的陷阱。该函数称为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";
我还添加了
严格
和警告
,以帮助自己避免常见的陷阱。我认为这应该是更有效的变体:
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";
我认为这应该是更有效的变体:
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";
此变量重复替换字符串中的所有占位符作为其相应的哈希值,直到没有占位符为止 此外,
a
对于任何变量来说都是一个错误的标识符,因此我将其命名为标记
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
此变量重复替换字符串中的所有占位符作为其相应的哈希值,直到没有占位符为止 此外,
a
对于任何变量来说都是一个错误的标识符,因此我将其命名为标记
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
始终
严格使用因此,您将避免许多问题。我不知道您正在运行什么代码来获得该结果。您发布的内容有三个语法错误,因此无法编译。当它们被修复时,它会完全按照你说的做。多亏了choroba,他修复了编译错误。很抱歉,我刚把我今天的烦恼记下来的东西打了出来。我现在想知道为什么今天早些时候它不起作用。明天我必须再调查一下真正的问题。总是严格使用因此,您将避免许多问题。我不知道您正在运行什么代码来获得该结果。您发布的内容有三个语法错误,因此无法编译。当它们被修复时,它会完全按照你说的做。多亏了choroba,他修复了编译错误。很抱歉,我刚把我今天的烦恼记下来的东西打了出来。我现在想知道为什么今天早些时候它不起作用。明天我必须再研究一下真正的问题。@hobbs:它用一个空字符串代替原来的字符串。它还引发了一个警告,因为它启用了未初始化的警告,我认为这是可取的。@hobbs:它像原始字符串一样替换空字符串。它还引发了一个警告,因为它启用了未初始化的警告,我认为这是可取的。这是一段糟糕的代码,尤其是因为如果相关的哈希元素不存在,它将无限期地循环。你真的应该测试你的答案。这是一段糟糕的代码,尤其是因为如果相关的哈希元素不存在,它将无限期地循环。你真的应该测试你的答案。