?

Log in

No account? Create an account
ещё один пост о говне в ЯП - ПоХаПэ прогроммисты [entries|archive|friends|userinfo]
ПоХаПэ прогроммисты

<?php Вебпага | Преобразователь гипертекстового кода из HTML в PHP ?>
<?php Об сообществе | livejournal userinfo ?>
<?php Архив | journal archive ?>

ещё один пост о говне в ЯП [Apr. 10th, 2009унд05:00 am]
ПоХаПэ прогроммисты

ru_pohape

[a_d_astra]
Вообще, наверное, нехорошо поливать грязью то, что несколько лет подряд кормило и до сих пор временами подкармливает. Но сил моих больше нет, честное слово!

В общем, как неприятно после хорошего снова переседать на говно, а! Как, покодив на C++/Qt (и это даже несмотря на общую кривоватость плюсегов), противно помогать соученикам с курсовыми на Дельфях, так и сейчас, после неплохой практики с Ruby/рельсами, кодить что-либо на php жутко влом. У меня тут висят несколько похапешных задач, которые я уже затянула просто до неприличия (жопа я!) - а заставить себя всё же крайне трудно. Но надо, да.

Господа, похапе таки говно - и, думаю, мало кто возьмётся с этим спорить. Меня ЗАДОЛБАЛИ эти никак не структурированные и имеющие кучу совершенно неочевидных глюков нюансов бесчисленные функции.

Вот хотя бы из недавнего. Задача такая: выдрать из некого объёма информации все дробные числа и округлить их до 2 знаков после запятой. Вообще, там это надо сделать в уже обработанном XSLT-процессором XMLe, но поскольку php-шная реализация XSLT не поддерживает replace(), то приходится делать дополнительный парсинг силами самого php. Закладка на хелп по preg_replace в php.net у меня давно уже стоит, но не всё так просто. В общем, пишу:

$result = preg_replace("/(\d+,\d+)/e", "round($1, 2)", $result);

Думаете, заработало? А хрен там! Ругается на неправильное количество параметров для round(). Я долго пыталась понять, в чём же дело. Перечитывала хелп по округлениям и пыталась понять, "то ли лыжи не едут, то ли я е#%нутый". И только где-то через час до меня дошло - а десятичный разделитель в оригинальном XML же - запятая! И эту запятую функция воспринимает как лишний разделитель между агрументами. Ну ладно, думаю, фигня война. Пишу так:

$result = preg_replace("/(\d+,\d+)/e", "round('$1', 2)", $result);

По всем прикидкам, это должно было бы работать правильно. А, опять же, хрен там! Даже несмотря на кавычки. Округляет почему-то не до сотых, а до целого. И, знаете, почему? А потому что при таком неявном преобразовании строки в число запятая НЕ рассматривается как разделитель целой и дробной частей! Только точка! Соответственно, выделяется только целая часть числа. Ну, блин. Мне так тоже не подходит. Начинаем извращаться!

$result = preg_replace("/(\d+,\d+)/e", "number_format(str_replace('$1', ',', '.'), 2, ',', '')", $result);

Собственно, number_format - это чтобы запятую потом на место вернуть, да. Но даже это всё равно не заработало, и вы никогда не догадаетесь, почему, и на что заругалось. А на самом деле, результат вычисления функции не может быть первым аргументом в number_format. Там может быть или строковая константа, или имя переменной! Ну ни хрена себе, а? Рациональной причины для подобных ограничений я не вижу - разве что могу предположить, что разработчики php люто ненавидят всё, что хоть немного похоже на функциональное программирование (впрочем, они и объектно-ориентированное-то не так давно полюбили). В итоге, конечным, рабочим вариантом стало вот такое:

$result = preg_replace("/(\d+),(\d+)/", "$1.$2", $result);
$result = preg_replace("/(\d+.\d+)/e", "number_format($1, 2, ',', '')", $result);

Вот так вот. Двойные накладные расходы и просто ну очень некрасиво. Вы тоже любите php, как люблю его я?

LinkReply

Comments:
[User Picture]From: f355
2009-04-19 07:18 pm (UTC)
псот отличный, но зачем нужна эта хуйня с кучей непонятных значков внизу?
(Reply) (Thread)
(Deleted comment)
[User Picture]From: f355
2009-04-20 10:25 am (UTC)
почему?
(Reply) (Parent) (Thread)
[User Picture]From: a_d_astra
2009-04-20 10:38 am (UTC)
а эта хуйня от кросспостилки на бестпёрсонс - удобная штука, кстати
(Reply) (Parent) (Thread)
[User Picture]From: f355
2009-04-20 10:39 am (UTC)

Re: Reply to your comment...

не знаю, меня она раздражает
(Reply) (Parent) (Thread)
From: ext_120798
2009-04-22 12:54 am (UTC)
потому что аффтар — мудак. точнее, аффтарица: ей срать на то, кто будет читать её высер, лишь бы высрать. отсюда и похуизм на оформление.
(Reply) (Parent) (Thread)
[User Picture]From: lasc
2009-04-19 09:20 pm (UTC)
пишешь на руби? продолжай писать на руби. чо в пхп то лезть?
(Reply) (Thread)
[User Picture]From: a_d_astra
2009-04-19 11:38 pm (UTC)
эм... я в то сообщество вообще попала? Такое впечатление, что тут ru_php какой-то :)
(Reply) (Parent) (Thread)
[User Picture]From: pigmeich
2009-04-19 11:53 pm (UTC)
Если от смены названия сообщества мозг оценка событий смещается на прямо противоположную, то это клиническое заболевание уже.

(Reply) (Parent) (Thread)
[User Picture]From: a_d_astra
2009-04-20 03:35 am (UTC)
я двже боюсь спросить, читала ли основная масса комментаторов старые посты этого сообщества, и понимает ли, для чего оно организовывалось :)
(Reply) (Parent) (Thread)
[User Picture]From: pigmeich
2009-04-20 03:38 am (UTC)
Лично я читал.
(Reply) (Parent) (Thread)
[User Picture]From: f355
2009-04-20 10:24 am (UTC)
ох
от пузи-кодеров сообщество стало только прекрасней, гыгы
продолжайте движение, это прекрасно
(Reply) (Parent) (Thread)
[User Picture]From: f355
2009-04-20 10:23 am (UTC)
опять вы
(Reply) (Parent) (Thread)
[User Picture]From: pigmeich
2009-04-20 10:58 am (UTC)
Grammar Nazi негодуэ.
(Reply) (Parent) (Thread)
[User Picture]From: zupernintendo
2009-04-19 10:44 pm (UTC)
ну обосрался жидко афтор, так зачем же постить эту хуиту?
(Reply) (Thread)
[User Picture]From: a_d_astra
2009-04-19 11:39 pm (UTC)
как говорили в интернетах в стародавние времена - обоснуй.
(Reply) (Parent) (Thread)
[User Picture]From: zupernintendo
2009-04-20 09:12 am (UTC)
если вы чотко программируете на Qt/C++ с руби/рельсами и вам там сухо и комфортно и бабла немеряно, так какого же хуя беретесь за пэхэпэ? это же очевидный фейл.
(Reply) (Parent) (Thread)
[User Picture]From: a_d_astra
2009-04-20 09:16 am (UTC)
по старой памяти :) Или брать "леваки" запрещено законом?
(Reply) (Parent) (Thread)
[User Picture]From: zupernintendo
2009-04-20 04:07 pm (UTC)
видимо во времена php3 кодили?
спешу вас обрадовать, c тех пор пэхэпэ эволюционировал, и появилось много функций, preg_replace_callback например.
(Reply) (Parent) (Thread)
[User Picture]From: f355
2009-04-22 05:16 am (UTC)
ПЭХЭПЭ ЭВОЛЮЦИОНИРОВАЛ
ПОЯВИЛОСЬ МНОГО ФУНКЦИЙ

какой ебаный ад все же этот похапе
(Reply) (Parent) (Thread)
[User Picture]From: ungzd
2009-04-23 01:55 pm (UTC)
АААААААА!!! Много-много функций!
(Reply) (Parent) (Thread)
[User Picture]From: pigmeich
2009-04-19 11:49 pm (UTC)
Представляет как бы это выглядело на C++/Qt.

Мерзко хихикает.
(Reply) (Thread)
[User Picture]From: esyr
2010-01-16 08:03 pm (UTC)
/me представил, как бы это выглядело бы на Python. Дико ржёт.
(Reply) (Parent) (Thread)
[User Picture]From: pigmeich
2010-01-18 11:41 am (UTC)
хто здесь?!
(Reply) (Parent) (Thread)
[User Picture]From: esyr
2010-01-18 12:00 pm (UTC)

Хто-хто

(Reply) (Parent) (Thread)
[User Picture]From: arm0
2009-04-20 04:52 pm (UTC)
выучите похапу. покурите мануал на синтаксис. похапе не виноват, что "1,2" и "1.2" это разные вещи.

$result = preg_replace("/(\d+,\d+)/e", "str_replace('.',',',round(str_replace(',','.','\\1'),2))", $result);
(Reply) (Thread)
[User Picture]From: arm0
2009-04-20 04:58 pm (UTC)
$result = preg_replace("/(\d+),(\d+)/e", "str_replace('.',',',round('\\1.\\2',2))", $result);
(Reply) (Parent) (Thread)
[User Picture]From: f355
2009-04-22 05:17 am (UTC)
почему тогда он виноват, что 1 и '1' - не разные вещи?
(Reply) (Parent) (Thread)
[User Picture]From: arm0
2009-04-22 05:52 pm (UTC)
потому, что пхп - язык для домохозяек!
(Reply) (Parent) (Thread)
From: ext_72902
2009-04-20 06:13 pm (UTC)
Не волнуйтесь, покодировав на хаскеле - понимаешь, какое говно этот сиплюсплюс.
(Reply) (Thread)
From: ext_120798
2009-04-22 12:55 am (UTC)
и в чём проблема? в том, что ты не потрудилась прочитать доку? заебись. конечно, это php виноват в том, что доки не читают. php уёбище, конечно, но совсем по другим причинам.
(Reply) (Thread)
From: shem_lab
2009-10-15 08:26 am (UTC)
да, глюков там хватает. Один только "white space bug" чего стоит...
(Reply) (Thread)
[User Picture]From: nikita_timofeev
2009-12-02 02:51 am (UTC)
А много сейчас работы на рельсах? Не троллинга ради...
(Reply) (Thread)