Очередной глюк Перла.
Если обрабатывающий блок внутри таких команд циклической обработки, как grep, map итп., вызывает функцию, а эта функция каким-то образом меняет $_, это нарушает работу цикла. При этом обычное использование $_ внутри таких же grep/map или for/foreach не мешает, т.к. они локализуют $_ внутри себя, используя отдельную копию. Но в данном случае grep вызывал функцию, а она вызывала другую функцию, а та читала файл через конструкцию типа while(<>) — и это вызывало глюки в цикле grep, с которого всё началось. Потому что while(<>) не локализует $_, в отличие от for/foreach, а использует глобальную переменную.
Какого хрена стандартная контрольная конструкция в языке должна глючить отттого, что какая-то функция на несколько уровней вызовов ниже использует какую-то переменную тоже вполне стандартным способом? Где модуляризация, [censored]?
Угрохал сегодня на это два часа. В конце концов, когда разобрался наконец, почему grep выдаёт мне полню херню, исправил это с помощью уродливого кладжа.
Сегодня я тоже Ненавижу Перл (tm).
no subject
no subject
no subject
Date: 2003-11-16 07:00 pm (UTC)no subject
Date: 2003-11-16 09:36 pm (UTC)no subject
Date: 2003-11-16 09:36 pm (UTC)всегда пишу "foreach my $foo (@bar)"
no subject
no subject
Date: 2003-11-16 11:54 pm (UTC)P.S.
А обзывают ли UNIX-программисты Си-шарп Си-хэшем?
no subject
Date: 2003-11-16 11:59 pm (UTC)Честно говоря, Perl IMHO нуждается в каком-то стандартном наборе ограничений, более жестком, чем use strict. Потому что сейчас вести большие проекты на перле -- вид мазохизма.
no subject
Date: 2003-11-17 12:38 am (UTC)no subject
Date: 2003-11-17 01:30 am (UTC)no subject
Date: 2003-11-17 02:12 am (UTC)Хотя ещё сырее перла, наверное. А java тяжелее (примерно как C#, наверное). А php не так быстр на нетривиальной логике. Некуда податься :-]
no subject
Date: 2003-11-17 02:13 am (UTC)no subject
Date: 2003-11-17 03:22 am (UTC)И вообще, взяв для себя за правило писать на Perl как на C, я избежал(IMHO) очень многих проблем..
то ж пердл...
Date: 2003-11-17 05:05 am (UTC)no subject
Date: 2003-11-17 05:51 am (UTC)Я почему-то думал что local $_ это имплицитное свойство любого замыкания. А это оказывается у некотрых операторов/функций делающих цикл.
no subject
Date: 2003-11-17 07:58 am (UTC)no subject
Date: 2003-11-17 08:06 am (UTC)no subject
Date: 2003-11-17 11:18 am (UTC)Ага
Date: 2003-11-17 12:23 pm (UTC)Не использую поэтому $_. Зато использую: warnings, use strict, ENGLISH. И если писать на перле как на C (т.е. достаточно строго), то действительно, можно избежать многих проблем. А держать большие проекты на перле также возможно, как и любом другом языке - все зависит от культуры программирования. Чем строже язык, тем ниже может быть культура программирования. И чтобы на таком языке, как perl, поддерживать больше проекты - нужно быть очень дисциплинированным программистом.
Говорю от имени опыта написания некоей большой системы. Мегабайты кода на перле.
Вот чего в перле никак нельзя делать - это деньги считать.
no subject
Date: 2003-11-18 12:23 am (UTC)