Модераторы: ginnie, JackYF
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> две сохраняющие группы 
:(
    Опции темы
evya
Дата 10.4.2013, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 7.3.2009

Репутация: нет
Всего: нет



подскажите господа!

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

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





PM MAIL   Вверх
DurRandir
Дата 10.4.2013, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 2
Всего: 17



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

Код

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'
}

PM   Вверх
evya
Дата 10.4.2013, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 7.3.2009

Репутация: нет
Всего: нет



а если поиск глобален?

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


PM MAIL   Вверх
DurRandir
Дата 10.4.2013, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 2
Всего: 17



Цитата

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;

PM   Вверх
evya
Дата 10.4.2013, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 7.3.2009

Репутация: нет
Всего: нет



Все примерно понятно! 
а в push можно расшифровать цикл немного по операциям
@{++$i % 2 ? \@first : \@second}, $_ for @foo; 
PM MAIL   Вверх
DurRandir
Дата 10.4.2013, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 2
Всего: 17



Значит, не понятно) Лучше тогда так:

Код

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

PM   Вверх
krypt3r
Дата 11.4.2013, 06:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: нет
Всего: 16



Цитата
(.)(.)

Весна! smile
PM MAIL   Вверх
Google
  Дата 19.11.2019, 07:34 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.1379 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.