Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > две сохраняющие группы


Автор: evya 10.4.2013, 12:50
подскажите господа!

есть регулярное выражение с двумя сохраняющими группами, можно ли получить их в условии???
если значений множество.
if (@code,@body)=$msg3=~m/^(.*?)^\s(.*?)/g)

или обязательно в цикл ставить, если в цикле то как можно проверить условие выполнения регулярки





Автор: DurRandir 10.4.2013, 14:24
Не очень понятно, в чём вопрос (и код только запутывает). Вот три рабочих варианта:

Код

my $foo = 'bar';

if (my @matches = $foo =~ /(.).(.)/){
  #@matches = ('b', 'r')
}

my ($b, $r) = $foo =~ /(.).(.)/;
if ($b && $r){
}

if ($foo =~ /(.).(.)/){
  #here $1 = 'b' and $2 = 'r'
}

Автор: evya 10.4.2013, 14:59
а если поиск глобален?

my (@b, @r) = $foo =~ /(.).(.)/g;
if ($b && $r){
}


Автор: DurRandir 10.4.2013, 17:19
Цитата

my (@b, @r) = $foo =~ /(.).(.)/g;

Если в списочном присваивании встречается массив, то он забирает в себя все значения до конца, и все переменные правее него будут пустыми. Это особенность перла, которую надо иметь в виду.

Поэтому один вызов m//g вернёт всё в один массив. Если надо разбивать сразу на 2 части - нужен цикл, но можно разбить и после, в духе:

Код

my @foo = "abcdef" =~ /(.)(.)/g;

my $i = 0;
my (@first, @second);
push @{++$i % 2 ? \@first : \@second}, $_ for @foo;

Автор: evya 10.4.2013, 20:32
Все примерно понятно! 
а в push можно расшифровать цикл немного по операциям
@{++$i % 2 ? \@first : \@second}, $_ for @foo; 

Автор: DurRandir 10.4.2013, 21:11
Значит, не понятно) Лучше тогда так:

Код

while ("abcdef" =~ /(.)(.)/g){
  print "matched: $1, $2\n";
}

Автор: krypt3r 11.4.2013, 06:09
Цитата
(.)(.)

Весна! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)