Regex Perl条件正则表达式提取

Regex Perl条件正则表达式提取,regex,perl,Regex,Perl,此条件必须与telco\u imac\u city或telco\u hier\u city匹配。当它成功时,我需要提取匹配值的第二个下划线 我可以用这个代码工作 if ( ($value =~ /(telco_imac_)city/) || ($value =~ /(telco_hier_)city/) ) { print "value is: \"$1\"\n"; } 但如果可能的话,我宁愿使用这样一个正则表达式 $value = $ARGV[0]; if ( $value =~ /

此条件必须与
telco\u imac\u city
telco\u hier\u 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\u hier\u city
,我会在测试第二个值时得到这个输出

Use of uninitialized value $1 in concatenation (.) or string at ./test.pl line 19.
value is: ""
我做错了什么?

while(){
while (<$input>){
    chomp;
    print "$1\n" if /(telco_hier|telco_imac)_city/;
}
咀嚼; 打印“$1\n”如果/(电信公司|电信公司| imac)城市/; }
根据单个语句中的匹配项进行编号。您的输入,
telco\u hier\u city
,与单个正则表达式的第二次捕获匹配(
/(telco\u imac\u)city |(telco\u hier\u)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_"
$> ./conditionalIfRegex.pl telco_hier_city
value is: "telco_hier_"

$> ./conditionalIfRegex.pl telco_imac_city
value is: "telco_imac_"
由于您的第一个捕获组(
(telco\u imac)
)中没有匹配项,
$1
未按预期初始化

要修复原始代码,请使用:

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_hier_city
value is: "telco_hier_"

$> ./conditionalIfRegex.pl telco_imac_city
value is: "telco_imac_"

OP想返回“匹配值的第二个下划线”(即,
telco\u hier\u
telco\u imac\u
)。如果
$value
telco\u imac\u
,会发生什么情况?@FlyingFrog用您的正则表达式(稍微修改的版本)编辑,谢谢!答案的原始部分有助于OP理解未初始化警告发生的原因。