2014-02-18 4 views
2

Данное условие должно соответствовать либо telco_imac_city, либо telco_hier_city. Когда это удается, мне нужно извлечь второй символ подчеркивания, который был сопоставлен.Perl условное вытягивание регулярного выражения

я могу заставить его работать с этим кодом

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 я получаю этот выход на тестирование второго значения

Что я делаю неправильно?

ответ

1
while (<$input>){ 
    chomp; 
    print "$1\n" if /(telco_hier|telco_imac)_city/; 
} 
+0

OP хочет вернуть «только до 2-го подчеркивания значения, что было подобрано» (т.е. , 'telco_hier_' или' telco_imac_'). – admdrew

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_" 
+0

Что происходит, когда '$ value' является' telco_imac_'? – fugu

+0

@FlyingFrog Отредактировано (измененная версия) вашего регулярного выражения, спасибо! Первоначальная часть ответа полезна для того, чтобы OP понимала, почему произошло неинициализированное предупреждение. – admdrew

Смежные вопросы