Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl:通过正则表达式匹配更改字符串_Regex_Perl - Fatal编程技术网

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

始终
严格使用严格使用