![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
MuToGeN , нету.
В Перле вообще нет разницы между строкой и числом. Если ты сравниваешь пременные eq, то они сравниваются как строки, если ==, то как числа. |
|||
|
||||
| pompei |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 2 Всего: 6 |
Во-первых: в перле числа и строки отличаются.
Во-вторых: если они отличаются, то должа быть задача, где нужно их отличать, например, сериалайзинг. В-третих: И должен быть способ как это сделать. Люди! Давайте всё таки разберёмся, как это сделать!!!!!!!!!!!! Информация для размышления: В перле есть возможность отличить строку от числа. Посмотрите вывод программы:
Вывод такой:
От сюда сразу напрашивается решение сделать что-то типа этого:
Вывод такой:
Но это очень уродливый пирожёк. Проследить как работает функция Dumper не получается, извилин не хватает. Может у кого получиться? Люди давайте разберёмся, а!!! Это сообщение отредактировал(а) pompei - 6.12.2007, 07:22 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
||||||||
|
|||||||||
| Ramirez |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Собственно, сам data dumper определяет следующим образом:
или вот еще вариант:
интересно было-бы увидеть надежный способ без регекспов. Это сообщение отредактировал(а) Ramirez - 6.12.2007, 12:53 |
||||
|
|||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Не, это не то. И 1 и '1' подходят под это рег. выражение, да иначе и быть. Наверное, чтобы определить, где число, а где строка, надо смотреть на их представление непосредственно в памяти. Только я никак не могу придумать, зачем бы это могло понадобиться.
|
|||
|
||||
| pompei |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 2 Всего: 6 |
Мне это нужно для передачи данных в JavaScript.
Например, перловскую конструкцию:
перевести в строку: '{ "asd": 1, "dsa" : "1", "u" : [123, "123"] }' которую передать в JavaScript, где прогнать её через фукнцию eval, и получить уже яваскриптовую конструкцию. Есть вариант всё представлять в виде строк, но это не красиво, и в общем то меня не устраивает. Добавлено @ 13:45
Это не то. для 1 и "1" - это условие даёт один результат, а мне надо чтобы отличатлся. Dumper-же как-то отличает строку от числа. Вопрос: как он это делает? Найти бы то место, где он это делает, и сделать так же. У меня это не получается. И дебаггер внутрь там одной функции лесть не хочет - проскакивает как "step over", когда я командую "step into". У меня пока вот так это реалицуется:
Это сообщение отредактировал(а) pompei - 6.12.2007, 14:15 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
||||||||
|
|||||||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Кстати, насчет eval:
|
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
И как насчет этого?
|
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 2 Всего: 6 |
Наоборот. Мне надо сложную структуру данных с перла передать в яваскрипт (иерархию сколькоугодно вложенных друг в друга массивов и хэшей содержащие числа и строки), чтобы на яваскрипте была точно такая же иерархия. Я преобразую эту структуру с помощью функции serializeToJS в строку, которую понимает яваскриптовый eval.
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
Думаю, что Dumper отличает строку от числа с помощью сишных функций, обращаясь непосредственно к памяти. Возможно, потому и не получается "step into". И если попробовать Data::Dupm (это pure perl) вместо Data::Dumper, то не увидим никакой разницы между 1 и "1". Добавлено через 2 минуты и 30 секунд Торможу... |
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Эээ, а не проще делать так?
UPD: Сори, прочитал весь топик, понял, что не то. Буду думать) Это сообщение отредактировал(а) KSURi - 6.12.2007, 17:26 -------------------- Died at Life.pl line 21 |
|||
|
||||
| Ramirez |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: 4 Всего: 5 |
Так раз вам JSON на выходе нужен, почему бы не воспользоваться
http://search.cpan.org/~makamaka/JSON-1.15/lib/JSON.pm а еще лучше http://search.cpan.org/~mlehmann/JSON-XS-2.01/XS.pm хотя, он тоже не различает, он все числа без кавычек выдает. разве это критично? UPDATE: JSON-XS в отличие от обычного JSON различает числа в кавычках и нет. расковырял Data::Dumper и выяснилось, что: он может работать через XS или средствами Perl. По дефолту он использует XS-реализацию. (XS как раз сильно типизирован в отличе от перла, поэтому он правильно обрабатывает числа в кавычках). А вот если Data::Dumper попросить не использовать XS, то он перестает отличать числа от чисел в кавычках:
на основании этого, смею предположить, что если вы будете использовать XS-реализацию JSON, то получите то, что хотите.
или, если вы принципиально хотите сериализировать самостоятельно, без сторонних модулей, то вам необходимо реализовать подобную проверку на Си и с помощью XS импортировать ее в Perl. Собственно, решение можно подсмотреть в xs-файлах того-же Data::Dumper и JSON-XS. По другому, видимо - никак.... Это сообщение отредактировал(а) Ramirez - 6.12.2007, 18:32 |
||||
|
|||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Наковырял чуть подробнее по XS.
На уровне XS перл представляет скаляр как структуру (SV). В нее может быть загужено 4 типа значений:
Это сообщение отредактировал(а) KSURi - 6.12.2007, 18:55 -------------------- Died at Life.pl line 21 |
|||
|
||||
| vadiml |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
есть еще и SvUOK(), но с ней проблемы в 64битной сборке
а на уровне XS это действительно делается элементарно: CheckType.xs
CheckType.pm
но все проверки достаточно условны, т.е. проверятся в каком контексте последний раз использовалась эта переменная. а на уровне перла есть только контекст текущего использования |
||||
|
|||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 2 Всего: 6 |
Я искренне всем благодарен за помощь.
ЗЫ. Меня несколько огорчило то, что в чистом перле нельзя это проверить. :( --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| pompei |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: 2 Всего: 6 |
Кстати именно для Вашего случая есть решение без герэкспов, довольно надёжное:
вывод:
Единственное что is_number( " 123" ) ложно. Но если перед return добавить $x =~ s/^\s+//; то всё нормально. Хотя может быть это как раз таки и не нужно. Это сообщение отредактировал(а) pompei - 7.12.2007, 09:01 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
||||||
|
|||||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |