166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
|
|||||||||||
1 | |||||||||||
Объяснить работу функции17.03.2014, 18:54. Показов 755. Ответов 3
Метки нет (Все метки)
Добрый день.
Решил поизучать на досуге Perl и столкнулся с проблемой. Есть у меня две функции:
Собственно проблема: только в одной функции выражение $_[1]=~ m/^\s*execute\s*(.*)/gi возвращает true, во второй false. Почему?
0
|
17.03.2014, 18:54 | |
Ответы с готовыми решениями:
3
Объяснить работу функции Работа функции qsort - объяснить работу функции Объяснить работу побитовой операции в функции Объяснить работу функции, вычисляющей сумму цифр числа |
5989 / 1998 / 323
Регистрация: 10.12.2013
Сообщений: 6,882
|
||||||||||||||||
18.03.2014, 05:56 | 2 | |||||||||||||||
если рассматривать этот пример через призму "Влияние стиля прграммирования на возникновение странных ошибок" я упростил стилистически вышеприведённый код, чтобы было пояснее.
Кликните здесь для просмотра всего текста
eee call result = EEE-ok(zhoppa s ruchkoj) fff call result = FFF-ok(zhoppa s ruchkoj) то есть, когда я стилистически исправлял, я механически заменил конструкцию номерных аргументов списка @_, на рекомендованную в смысле правильного стиля my $arg1 = shift; вернём авторский вариант:
Кликните здесь для просмотра всего текста
eee call result = EEE-ok(zhoppa s ruchkoj)
fff call result = FFF-no Теперь убираем модификатор /g из регулярного выражения m/^\s*execute\s*(.*)/gi , ( он всё равно не нужен, потому что жадный поиск схавает по / (.*) / всё до конца строки за один присест ) и опять всё становится нормально: Кликните здесь для просмотра всего текста
eee call result = EEE-ok(zhoppa s ruchkoj) fff call result = FFF-ok(zhoppa s ruchkoj) Интрига достигает апогея и в этот волнующий момент наш простой и скромный программист Перл вспоминает, что выражение $_[n] - это простой alias на собственно переданный аргумент ( или по С-ишному ссылка -> изменив $_[n], мы изменим и сам аргумент ), а вот выражение $arg1 = shift честно копирует аргумент в $arg1; одновременно с этим наш скромняга-герой вспоминает, что в скалярном контексте поиск с модификаторм /g последовательно возвращает каждый следующий найденный шаблон, двигая указатель, который можно, например, извлечь с помощью функции pos( x ), а поскольку $_[0] в функциях eee() и fff() указывает на одно и то же место и собственно рег. выражение одно и то же, я намекаю на то, что оптимизатор применил шаблон согласно модификатору /g к одному и тому же выражению 2раза: в первый раз вернулась жопа с ручкой, а второй раз не вернулось ничего, потому что всё уже было съедено и механизм рег. выражений закончил работу. можно трактовать это как ошибку реализации или же как фичу, но получается, что Д.Конвэй прав - если писать стилистически красиво, то на такие фичи никогда и не нарвёшься. Добавлено через 13 минут а оптимизатор я обвиняю потому, что если вызывать вот так
1
|
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
|
|
18.03.2014, 09:47 [ТС] | 3 |
Копипаст =) Не думал что он так сказывается.
Да. Это я понял. Но применение регулярки к строке разве меняет ее? Но контекст то функций разный. По правилам хорошего тона( по крайней мере С-шного) он должен был применить его еще раз, независимо от предыдущих вызовов. Просто на С, сие работало бы без проблем) Спасибо за развернутый ответ.
0
|
5989 / 1998 / 323
Регистрация: 10.12.2013
Сообщений: 6,882
|
||||||
18.03.2014, 11:25 | 4 | |||||
Вот так нагляднее:
Кликните здесь для просмотра всего текста
first call result = first-ok(aaaa)
another call result = another-ok(bbbb) yet_another call result = yet_another-ok(cccc)
1
|
18.03.2014, 11:25 | |
18.03.2014, 11:25 | |
Помогаю со студенческими работами здесь
4
Объяснить работу функции, возвращающей указатель на указатель на char Объяснить работу Объяснить работу кода Объяснить работу кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |