regex$1变量重置

regex$1变量重置,regex,perl,Regex,Perl,我有以下示例perl脚本: 使用警告; 严格使用; my$cont1='项目:测试'; my$cont2='项目:测试'; $cont1=~s/项目:(.*)/$1/;我的$1=$1; $cont2=~s/dtms:(.*)/$1/;我的2美元=1美元; 打印“一=一\n两=二\n”; 此脚本执行的结果为: one = test two = test 问题是$1在第一次成功的正则表达式匹配后没有重置,结果第二个正则表达式实际上失败了,应该为空,但它从上一次匹配中获取$1的值。通过在第一个正则

我有以下示例perl脚本:

使用警告;
严格使用;
my$cont1='项目:测试';
my$cont2='项目:测试';
$cont1=~s/项目:(.*)/$1/;我的$1=$1;
$cont2=~s/dtms:(.*)/$1/;我的2美元=1美元;
打印“一=一\n两=二\n”;
此脚本执行的结果为:

one = test
two = test
问题是$1在第一次成功的正则表达式匹配后没有重置,结果第二个正则表达式实际上失败了,应该为空,但它从上一次匹配中获取$1的值。通过在第一个正则表达式之后添加奇数正则表达式,我找到了重置$1=的一个奇怪的解决方法:

"1" =~ /1/;
结果现在是正确的:

one = test
two =

问题是:这是重置$1的最佳实践吗?

您不重置
$1
。相反,在使用任何捕获变量之前,一定要测试正则表达式是否匹配

my $cont1 = 'item:test';
my $cont2 = 'item:test';

if ($cont1 =~ s/item:(.*)/$1/) {
    print "one = $1\n";
}

if ($cont2 =~ s/dtms:(.*)/$1/) {
    print "two = $1\n";
}
如果确实要初始化
$one
$two
,请使用
?:

my $one = $cont1 =~ s/item:(.*)/$1/ ? $1 : '';
my $two = $cont2 =~ s/dtms:(.*)/$1/ ? $1 : '';

您不会重置
$1
。相反,在使用任何捕获变量之前,一定要测试正则表达式是否匹配

my $cont1 = 'item:test';
my $cont2 = 'item:test';

if ($cont1 =~ s/item:(.*)/$1/) {
    print "one = $1\n";
}

if ($cont2 =~ s/dtms:(.*)/$1/) {
    print "two = $1\n";
}
如果确实要初始化
$one
$two
,请使用
?:

my $one = $cont1 =~ s/item:(.*)/$1/ ? $1 : '';
my $two = $cont2 =~ s/dtms:(.*)/$1/ ? $1 : '';
但是取而代之的是上一场比赛的1美元,你怎么知道的?请注意,$cont1和$conts持有相同的字符串,但它从上一个匹配中获取$1的值,您如何知道这一点?请注意,$cont1和$conts持有相同的字符串。