![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Andrey1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 27.2.2004 Где: Moscow Репутация: нет Всего: 5 |
Как определить, является ли значение строковой переменной числом?
(как известно, в перле сравнения численные и символьные (> и gt) отличаются Спасибо. Андрей -------------------- Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания. из сутры помоста шестого патриарха Хуэйнена |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
|
|||
|
||||
| Andrey1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 621 Регистрация: 27.2.2004 Где: Moscow Репутация: нет Всего: 5 |
Если первое d -> \d, то будет правильно.
Только, правда, не понимаю, зачем ?: Это сообщение отредактировал(а) Andrey1 - 15.6.2004, 12:35 -------------------- Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания. из сутры помоста шестого патриарха Хуэйнена |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
(?: ... ) это я уж не помню что, но это форма такая
|
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
?: используется, если нужно объединение в группу, но при этом не нужно запоминание в массив с найденными совпадениями.
-------------------- |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Почему в массив? $1, $2 и т.д , помоему являются, специальными, скалярными переменными. Это сообщение отредактировал(а) korob2001 - 15.6.2004, 22:34 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
Опс... Сорри, давно с Перлом не общался) Ну, я думаю, меня все поняли.
-------------------- |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 1 Всего: 39 |
а если так:
|
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
А что есть число? 0 - это число? Если число, то любая строка является числом.
-------------------- |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 1 Всего: 39 |
Nobody
Насколько я понимаю нужно проверить: $a="Вася Пупкин" или $a=12 Хотя в перле разница между числом и не числом бовольно зыбкая: "Вася пупкин"==0 есть true |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
Secandr
Вот-вот. Обычно проще принудительно сделать переменную числом (например, прибавив нуль), чем париться с тем, что она из себя представляет. -------------------- |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 1 Всего: 39 |
Nobody
В пхп и перле всегда принятые числовые значения из формы обрабатываю $a+=0; Незнаю можно ли сделать проверку быстрее |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
Secandr
не, в PHP я делаю немного грамотней:
Ой, щас нас бить за оффтоп начнут... -------------------- |
|||
|
||||
| MuToGeN |
|
|||
![]() Лесник ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4379 Регистрация: 15.8.2002 Где: Москва Репутация: нет Всего: 32 |
А что, в перле чего-то типа PHPшного is_numeric() или is_int() нет?
-------------------- Three pings for the token rings, Five pings for the UNIX machines, Hundred pings for the broken links, One special ping to check them all Through Simple Network Management Protocol! |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: нет Всего: 16 |
А просто не очень понятно, зачем надо. Нужно тебе число - так сделай с переменной что-нибудь, чтобы она точно стала числом, и не парься.
-------------------- |
|||
|
||||
| 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 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
||||||
|
|||||||
| tishaishii |
|
||||||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
Дак чем не устраивают перечисленные варианты: регвыр или приведение к числу?
Самое простое:
А если число записано в x16 или x8? Посложнее:
Добавлено через 6 минут и 57 секунд А ещё в Perl можно записывать числа так: 1______000_0
|
||||||
|
|||||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |