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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> объясните почему этот код дает такой результат? о контексте 
:(
    Опции темы
zyxerr
Дата 1.12.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



1) if (“199.168.0.19” =~ m/(\d+)/g){print “found: $1\n”}
2) foreach (“199.168.0.19” =~ m/(\d+)/g){print “found: $1\n”}
3) while (“199.168.0.19” =~ m/(\d+)/g){print “found: $1\n”}
.
почему в первом случае пишет "199" (это в принципе понятно)
во втором случае пишет “199.168.0.19” (это тоже)
а в третьем случае пишет "19.19.19.19" (а здесь почему??)
.
кто знает еще примеры подобных "ловушек"?

Добавлено через 2 минуты и 52 секунды
Т.е. вот так выглядят:
1) if (“199.168.0.19” =~ m/(\d+)/g){print “$1 ”}
2) foreach (“199.168.0.19” =~ m/(\d+)/g){print “$1 ”}
3) while (“199.168.0.19” =~ m/(\d+)/g){print “$1 ”}

Добавлено через 5 минут и 11 секунд
ой, простите, совсем запутался :(
.
1) if (“199.168.0.19” =~ m/(\d+)/g){print “$1 ”}
2) while (“199.168.0.19” =~ m/(\d+)/g){print “$1 ”}
3) foreach (“199.168.0.19” =~ m/(\d+)/g){print “$1 ”}
.
почему в первом случае пишет "199" (это в принципе понятно)
во втором случае пишет “199.168.0.19” (это тоже)
а в третьем случае пишет "19.19.19.19" (а здесь почему??)
.

PM MAIL   Вверх
amg
Дата 1.12.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



zyxerr, "19.19.19.19" -- это 2-й, а не 3-й случай. Именно во 2-м случае регулярное выражение вынуждено отработать сразу и в списковом контексте. При этом оно вернет список из 4-х элементов, ну а $1 -- последовательно пробежится по всем числам и останется равной последнему (19). Ну и foreach в итоге 4 раза напечатает это число.
PM MAIL   Вверх
zyxerr
Дата 1.12.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да, именно. Причем, если в print набрать НЕ $1 а $_, то результат foreach совпадает с while!
PM MAIL   Вверх
tolkien
Дата 2.12.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В случаи foreach (“199.168.0.19” =~ m/(\d+)/g){print “$1 ”}
Сначала foreach формирует список. Потом последовательно по списку проходит. Отсюда и такой результат. Он послед присваивает значения из списка переменной $_. А вы печатайте значение переменной $1. Которое будет иметь всегда 19. Т.к имеено это значение было последним найденным регулярным выражением.

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


Шустрый
*


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

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



ясно, спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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