Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > объясните почему этот код дает такой результат?


Автор: zyxerr 1.12.2008, 16:40
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" (а здесь почему??)
.

Автор: amg 1.12.2008, 16:58
zyxerr, "19.19.19.19" -- это 2-й, а не 3-й случай. Именно во 2-м случае регулярное выражение вынуждено отработать сразу и в списковом контексте. При этом оно вернет список из 4-х элементов, ну а $1 -- последовательно пробежится по всем числам и останется равной последнему (19). Ну и foreach в итоге 4 раза напечатает это число.

Автор: zyxerr 1.12.2008, 17:03
да, именно. Причем, если в print набрать НЕ $1 а $_, то результат foreach совпадает с while!

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

Автор: zyxerr 2.12.2008, 14:04
ясно, спасибо

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