|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Sergey 2:5020/400 24 Dec 2006 17:56:06 To : All Subject : Hет логики ни в чем --------------------------------------------------------------------------------
Привет.
Кто-нибудь может по-человечески объяснить, как работают операторы \L \l \U \u
и им подобные? Я ни в книжках, ни в файлах к activeperl этого не нашел. У этих
операторов есть какая-нибудь ассоциативность и приоритет?
Берем пример:
print "\L\udD";
\L говорит, что все буквы до конца строки будут маленькими, \u говорит: фиг
тебе, d сразу после меня все равно будет большой. Есть ли какое-то правило,
чтобы это определять?
В результате получается Dd.
Берем другой пример:
print "\LdD\udD";
\L и \u говорят то же самое, в результате получаем dddd... Маразм? Да!
По идее, у подобных операторов должна быть правая ассоциативность, но на
самом деле вообще непонятно, как они работают.
И почему последовательность "...\L\U..." и обратная ей считаются ошибкой
синтаксиса? Почему \l\u не считаются?
Стоит попробовать капнУть Перл поглубже, как натыкаешься на что-то гнилое. Я
уже сюда писал, что код
map{while(1){}}@a;
завешивает транслятор до версии 5.8.5 и на виндовс, и на юникс. Здесь смысл
не в том, что циклы пустые, а лишь в том, что цикл while стоит внутри цикла
map.
Когда я начал выяснять, что послужило причиной зависания моей программы, то у
меня сложилось впечатление, что я первый, кто начал программировать на Перле.
Как будто не было 15-летней мировой практики, и я впервые вставил while внутрь
map.
В процессе написания несложных программок я наткнулся еще на пару ошибок, но
вовремя их не зафиксировал и не запомнил.
Hедавно наткнулся на такое описние условного шаблона в документации
Perl/html/lib/Pod/perlretut.html#conditional_expressions:
Conditional expressions
A conditional expression is a form of if-then-else statement that allows one
to choose which patterns are to be matched, based on some condition. There are
two types of conditional expression: (?(condition)yes-regexp) and
(?(condition)yes-regexp|no-regexp).
И далее:
The condition can have two forms. The first form is simply an integer in
parentheses (integer).
Hе должно быть скобок вокруг условия, должно быть (? condition yes-regexp)
and (? condition yes-regexp|no-regexp)
А то по этому определению надо писать (?((1))..., а это ошибка синтаксиса.
Это определение с лишними скобками пошло гулять по справочникам и прочим
учебникам. Хоть бы кто удосужился его проверить.
Вот так вот, вместо того, чтобы писать лекции, приходится заниматься этой
бесплатной тратой времени.
Видимо, на атомных элктростанциях не используют Перл, а то бы все уже
почувствовали на себе эту самую мощь Перла и его регулярных выражений.
Есть ли кто-то, кто платит деньги за найденные ошибки в Перле? Я подозреваю,
что смогу стать миллионером...
Сергей
--- ifmail v.2.15dev5.3
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.perl/1667916bd4cd8.html, оценка из 5, голосов 10
|