此条件必须与telco_imac_city
或telco_hier_city
匹配。当它成功时,我需要提取到匹配值的第二个下划线。
我可以使用此代码
if ( ($value =~ /(telco_imac_)city/) || ($value =~ /(telco_hier_)city/) ) {
print "value is: \"$1\"\n";
}
但如果可能,我宁愿使用像这样的单一正则表达式
$value = $ARGV[0];
if ( $value =~ /(telco_imac_)city|(telco_hier_)city/ ) {
print "value is: \"$1\"\n";
}
但是如果我传递值telco_hier_city
,我会在测试第二个值
Use of uninitialized value $1 in concatenation (.) or string at ./test.pl line 19.
value is: ""
我做错了什么?
答案 0 :(得分:1)
while (<$input>){
chomp;
print "$1\n" if /(telco_hier|telco_imac)_city/;
}
答案 1 :(得分:1)
Perl capture groups根据单个语句中的匹配进行编号。您的输入telco_hier_city
与该单个正则表达式(/(telco_imac_)city|(telco_hier_)city/
)的第二个捕获匹配,这意味着您需要使用$2
:
my $value = $ARGV[0];
if ( $value =~ /(telco_imac_)city|(telco_hier_)city/ ) {
print "value is: \"$2\"\n";
}
输出:
$> ./conditionalIfRegex.pl telco_hier_city
value is: "telco_hier_"
由于您的第一个捕获组((telco_imac_)
)中没有匹配项,$1
未按预期进行初始化。
要修复原始代码,请使用FlyingFrog's regex:
my $value = $ARGV[0];
if ( $value =~ /(telco_hier_|telco_imac_)city/ ) {
print "value is: \"$1\"\n";
}
输出:
$> ./conditionalIfRegex.pl telco_hier_city
value is: "telco_hier_"
$> ./conditionalIfRegex.pl telco_imac_city
value is: "telco_imac_"