?

Log in

рабочее - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

рабочее [ноя. 16, 2003|11:45 pm]
Anatoly Vorobey
[Настроение |angryangry]



Очередной глюк Перла.

Если обрабатывающий блок внутри таких команд циклической обработки, как grep, map итп., вызывает функцию, а эта функция каким-то образом меняет $_, это нарушает работу цикла. При этом обычное использование $_ внутри таких же grep/map или for/foreach не мешает, т.к. они локализуют $_ внутри себя, используя отдельную копию. Но в данном случае grep вызывал функцию, а она вызывала другую функцию, а та читала файл через конструкцию типа while(<>) — и это вызывало глюки в цикле grep, с которого всё началось. Потому что while(<>) не локализует $_, в отличие от for/foreach, а использует глобальную переменную.

Какого хрена стандартная контрольная конструкция в языке должна глючить отттого, что какая-то функция на несколько уровней вызовов ниже использует какую-то переменную тоже вполне стандартным способом? Где модуляризация, [censored]?

Угрохал сегодня на это два часа. В конце концов, когда разобрался наконец, почему grep выдаёт мне полню херню, исправил это с помощью уродливого кладжа.

Сегодня я тоже Ненавижу Перл (tm).
СсылкаОтветить

Comments:
[User Picture]From: nice_beaver
2003-11-16 01:55 pm

It's a tool
(Ответить) (Thread)
[User Picture]From: avva
2003-11-16 01:57 pm

Tou fucking ché.
(Ответить) (Parent) (Thread)
[User Picture]From: cema
2003-11-16 07:00 pm
Не люблю. Есть такое дело, да.
(Ответить) (Thread)
From: ex_ilyavinar899
2003-11-16 09:36 pm
Switch to C#.
(Ответить) (Thread)
[User Picture]From: avva
2003-11-16 11:34 pm

Не дождётесь!
(Ответить) (Parent) (Thread)
[User Picture]From: onodera
2003-11-16 11:54 pm
Ну хоть на пхп (хотя только читать на нём умею ^^').
P.S.
А обзывают ли UNIX-программисты Си-шарп Си-хэшем?
(Ответить) (Parent) (Thread)
From: 9000
2003-11-17 02:13 am
Слышал название "ре-бемоль" (т. к. C# есть обозначение "до-диез").
(Ответить) (Parent) (Thread)
[User Picture]From: smilga
2003-11-17 11:18 am
Это хуже, чем ре-бемоль. Это D-flat.
(Ответить) (Parent) (Thread)
From: 9000
2003-11-17 02:12 am
А почему? Язык-то вполне себе, а открытые реализации CLR существуют (mono, да).
Хотя ещё сырее перла, наверное. А java тяжелее (примерно как C#, наверное). А php не так быстр на нетривиальной логике. Некуда податься :-]
(Ответить) (Parent) (Thread)
[User Picture]From: squadette
2003-11-16 09:36 pm
у меня было ичсто интуитивное подозрение к $_ и @_ "как только я их увидел"

всегда пишу "foreach my $foo (@bar)"
(Ответить) (Thread)
[User Picture]From: yorool_gui
2003-11-16 11:59 pm
Аналогично. В моих программах встретить $_ практически невозможно, если это не скрипт типа "написал, запустил и выбросил".
Честно говоря, Perl IMHO нуждается в каком-то стандартном наборе ограничений, более жестком, чем use strict. Потому что сейчас вести большие проекты на перле -- вид мазохизма.
(Ответить) (Parent) (Thread)
[User Picture]From: b_a_t
2003-11-17 03:22 am
Та же фигня, поэтому когда у коллеги был аналогичный затык, очень дико удивлялся, как же так можно было сделать...

И вообще, взяв для себя за правило писать на Perl как на C, я избежал(IMHO) очень многих проблем..
(Ответить) (Parent) (Thread)
[User Picture]From: gaal
2003-11-17 12:38 am
See also the long thread on comp.lang.perl.moderated.
(Ответить) (Thread)
[User Picture]From: sova
2003-11-17 01:30 am
What's "diagonality" as applied to programming languages?
(Ответить) (Thread)
From: (Anonymous)
2003-11-17 05:05 am

то ж пердл...

пользуйтесь Python.
(Ответить) (Thread)
[User Picture]From: avnik
2003-11-17 05:51 am
Упс.
Я почему-то думал что local $_ это имплицитное свойство любого замыкания. А это оказывается у некотрых операторов/функций делающих цикл.
(Ответить) (Thread)
[User Picture]From: alexcohn
2003-11-17 07:58 am
а для чего ($_ = $tmp) в хвосте grep?
(Ответить) (Thread)
[User Picture]From: avva
2003-11-17 08:06 am
Чтобы восстановить разрушенное вызовом функции значение $_, т.к. grep по завершении блока выдаст наружу именно $_, а не мой $tmp.
(Ответить) (Parent) (Thread)
[User Picture]From: alexcohn
2003-11-18 12:23 am
То есть по крайней мере его grepa встроенному циклу этот $_ не помеха... И то ладно
(Ответить) (Parent) (Thread)
[User Picture]From: egorfine
2003-11-17 12:23 pm

Ага

я это нутром чувствовал(c)

Не использую поэтому $_. Зато использую: warnings, use strict, ENGLISH. И если писать на перле как на C (т.е. достаточно строго), то действительно, можно избежать многих проблем. А держать большие проекты на перле также возможно, как и любом другом языке - все зависит от культуры программирования. Чем строже язык, тем ниже может быть культура программирования. И чтобы на таком языке, как perl, поддерживать больше проекты - нужно быть очень дисциплинированным программистом.

Говорю от имени опыта написания некоей большой системы. Мегабайты кода на перле.

Вот чего в перле никак нельзя делать - это деньги считать.
(Ответить) (Thread)