| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| ясно, спасибо |