Perl条件正则表达式提取

时间:2014-02-18 21:21:58

标签: regex perl

此条件必须与telco_imac_citytelco_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: ""

我做错了什么?

2 个答案:

答案 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_"