Во-первых, никогда не используйте конструкцию типа:
my $var = $val if( $some );
согласно документации:
ПРИМЕЧАНИЕ. Поведение my, state или our изменено с помощью условного модификатора оператора или конструкции цикла ( например, my $x if ... ) не определено. Значение переменной my может быть undef, любым ранее присвоенным значением или любым другим. Не полагайтесь на это. Будущие версии Perl могут делать что-то отличное от той версии Perl, на которой вы ее пробуете. Вот драконы.
Оператор m//
, когда модификатор /g
указан в контексте списка, возвращает список подстрок, соответствующих любым захватывающим скобкам в регулярном выражении. Итак, как говорит @Сухой27 в комментарии выше, вы должны использовать:
my ($some) = $str =~ m/...(...).../g;
На простом примере:
use strict;
use warnings;
my $u="undefined";
my $str = q{some="string" another="one"};
#will match
my ($m1) = $str =~ m/some="(.*?)"/g;
print 'm1=', $m1 // $u, '= $1=', $1 // $u, "=\n";
#will NOT match
my ($m2) = $str =~ m/nothere="(.*?)"/g;
print 'm2=', $m2 // $u, '= $1=', $1 // $u, "=\n";
#will match another
my ($m3) = $str =~ m/another="(.*?)"/g;
print 'm3=', $m3 // $u, '= $1=', $1 // $u, "=\n";
печатает:
m1=string= $1=string=
m2=undefined= $1=string= #the $1 hold previously matched value
m3=one= $1=one=
Как видите, $1
остается, если сопоставление НЕ успешно. В документации говорится:
Эти специальные переменные, такие как хэш %+ и пронумерованные переменные совпадения ($1
, $2
, $3
и т. д.), динамически контролируются до конца окружающего блока или до следующего успешного совпадения, в зависимости от того, что наступит раньше. (См. Составные операторы в perlsyn.)
ПРИМЕЧАНИЕ. Неудачные совпадения в Perl не сбрасывают переменные сопоставления, что упрощает написание кода, который проверяет ряд более конкретных случаев и запоминает наилучшее совпадение.
Итак, если вы не хотите определять $1
, вы можете заключить соответствующую часть в блок, например:
use strict
use warnings;
my $u="undefined";
my $str = q{some="string" another="one"};
my($m1,$m2,$m3);
{($m1) = $str =~ m/some="(.*?)"/g;}
print 'm1=', $m1 // $u, '= $1=', $1 // $u, "=\n";
{($m2) = $str =~ m/nothere="(.*?)"/g;}
print 'm2=', $m2 // $u, '= $1=', $1 // $u, "=\n";
{($m3) = $str =~ m/another="(.*?)"/g;}
print 'm3=', $m3 // $u, '= $1=', $1 // $u, "=\n";
что печатает
m1=string= $1=undefined=
m2=undefined= $1=undefined=
m3=one= $1=undefined=
PS: я не гуру Perl, возможно, другие дополнят/исправят этот ответ.
person
jm666
schedule
19.02.2015
my ($marke) = $content =~ m{data-brand="(.*?)"}gism;
лучше, чемmy $marke = $1 if ($content =~ m{data-brand="(.*?)"}gism);
- person mpapec   schedule 19.02.2015