Регулярное выражение несовместимо - PullRequest
0 голосов
/ 14 июля 2020

Использование набора результатов из моей БД ....

my $item_name = "Special Anniversary set by Brand Name"
my $item_name1 = $item_name;
$item_name1 =~ m/brand name/i;
$brand = $&; # a system var of the regex result

Торговая марка выводит правильно: «Торговая марка»

my $item_name2 = $item_name;
$item_name2 =~ m/Special Anniversary by brand_name/i;
$sub_brand = $&; # a system var of the regex result

Суббренд выводится неправильно / непоследовательно.

if ( $item_name eq 'Special Anniversary set by Brand Name' )
{
$brand outputs as 'Brand Name'; # correct
$sub_brand outputs as 'Special anniversary by Brand Name'; #correct
}
elsif( $item_name eq 'Something else by Brand Name' )
{
$brand outputs as 'Brand Name';# correct
$sub_brand = 'Brand Name'; #INCORRECT  I expect it to be null.

}  

Надеюсь, это достаточно лаконично, но понятно.

Однако, если нет, суббренд возвращает название бренда (или, возможно, конец желаемой строки), если оно не совпадает .

Я думаю, он возвращает значение $ & из первого регулярного выражения, потому что оно не было перезаписано совпадением во втором регулярном выражении.

Я был бы признателен за любые ваши предложения.

1 Ответ

2 голосов
/ 14 июля 2020

Я думаю, он возвращает значение $& из первого регулярного выражения, потому что оно не было перезаписано совпадением во втором регулярном выражении.

Это верно.

Буду признателен за любые ваши предложения.

Поскольку вы хотите использовать только $&, совпадение было успешным, проверьте, было ли совпадение успешным, прежде чем использовать $& .

my $sub_brand;
if ($item_name2 =~ /Special Anniversary by brand_name/i) {
   $sub_brand = $&;
}

или

my $sub_brand = $item_name2 =~ /Special Anniversary by brand_name/i ? $& : undef;

Вы также можете использовать

my ($sub_brand) = $item_name2 =~ /(Special Anniversary by brand_name)/i;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...