![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемые коллеги! В разделе вакансий Perl-разработчиков на Яндексе публикуются тестовые задания. Одно из заданий такое
Что напечатает программа?
Как обычно, если чем-то часто не пользуешься, то со временем оно забывается. Так и в данном случае из головы выветрилось, какие скалярные значения являются false в булевом контексте. Цитата из Уолл Л., Кристиансен Т., Орвант Д. Программирование на Perl (3-е издание):
Соответственно значение "0" в булевом контексте будет false, а "00" и "000" - true. Из-за подобной забывчивости можно делать ошибки, аналогичные такой:
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Поэтому я делаю
Но кстати, стоит отметить, что CGI.pm возвращает '' (пустую строку), если параметр в запросе присутствует, но значение у него пустое. А вот если параметра в запросе вообще нет, то тогда вернет undef -------------------- Died at Life.pl line 21 |
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Все книги по CGI пестрят рекомендациями о необходимости фильтрации входных данных. В указанном выше примере как раз это не сделанно.
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый KSURi, я как раз об этом и написал, что не сразу видно проблему.
этот код вернет 00, т.к. он true в булевом контексте -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Вопрос конечно интересный, и легко ошибиться, только вот интуиция всегда подсказывает, что 0 - это ноль, а "000" - не совсем понятно что, чисто с математической точки зрения. В математике нет такого 000, а значит 000 не равно(не тождественно равно, если угодно) 0, но false только в случае когда 0, и значит вероятнее всего что "000" даст true. Что на практике и оказывается так
Может немного сумбурно, но думаю все же понятно -------------------- менеджер по кодеврайтингу |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Bulat, объяснение очень натянутое, т.к.
т.к. Perl считает, что "000" и 0 с математической точки зрения (т.е. при приведении к одному типу - числу) тождественно равны. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Не согласен.
Булевая проверка - это одно действие, а приведение к одному типу совсем иное. Разные операции выполняются над одним и тем же объектом, что есс-но может выдать два противоположных результата -------------------- менеджер по кодеврайтингу |
|||
|
||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
ginnie, вот я видимо не сразу увидел, в чем вы обозначили проблему)
Ни разу просто не сталкивался с ситуацией, когда в параметре "000" передается Это сообщение отредактировал(а) KSURi - 4.6.2008, 09:54 -------------------- Died at Life.pl line 21 |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Bulat, давайте пойдем от обратного: возьмем для примера число 0.0, которого, по аналогии с 000 тоже нет. С математической точки зрения, по Вашему алгоритму, оно должно, вероятнее всего, быть true. Но это не так (так-же, как и в случае с 000). True оно будет только если его представить в виде строки "0.0", но это уже не математика
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
ginnie, 0.0 - не являетс переменной типа int
А булевы функции не стоит отождествлять с перлом -------------------- менеджер по кодеврайтингу |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Bulat, при чем тут int и double? В булевом контексте числа 0, 0.0, 0.00, 00, 000 имеют значение false.
Мы обсуждаем не булевы функции, а булев контекст. Причем именно применительно к Perl. О каком отождествлении идет речь? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
||||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
ginnie, Булева функция
Мне хотелось бы посмотреть, где в булевой функции или алгебре вы видели числа 0.0, 000, 0.00 и т.п. Добавлено через 7 минут и 52 секунды
Обрати внимание что выводится как $a в каждом из трех примеров. -------------------- менеджер по кодеврайтингу |
||||||
|
|||||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Bulat, спасибо за ссылку, но булевы функции к нашему разговору отношения не имеют. Мы обсуждаем какие значения Perl интерпретирует как true, а какие - false.
Извините за нескромный вопрос: какой, по Вашему мнению, критерий тождественного равенства двух чисел в конкретном языке программирования? И почему 000 тождественно не равно 0? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
ginnie, Если начинать размышления не отталкиваясь от перла, а именно от булевских функций, то ошибится сложнее.
В перле нет деления на типы перемнных, есть скаляры. Но в булевом контексте "000" будет интерпретироватся не как числовой тип, а как строковой тип. Поэтому в перл "000" не тождественно равно "0". А что касается других языков, там-то как раз все проще, потому как и "0" числового типа и "000" числового типа действительно тождественно равны, потому что они оба числовые типы(int). Вся суть лишь в том, как интепретирует перл тот или иной скаляр в булевом контексте. Собственно основным критерием как раз и является тип перемнной, в случае с перлом - скаляра. И даже, что касается "0.0", как видно из выше мною приведенных примеров, в булевом контексте опять же "0.0" (тип double) предварительно приводится к типу (int), что подверждает последующий print , где на выходе уже не "0.0", а "0". P.S. все же не стоит забывать, что даже если в перле нет необходимости указывать явно тип перемнной(скаляра), этого нет вообще. За нас это делает интерпретатор Добавлено через 5 минут и 32 секунды Проще говоря, в языках где нужно явно указывать тип перемнной, можно присвоить перемнной типа int значение "01", но язык это приведет к виду "1" без 0 идущим перед 1. Перл же посчитает такой скаляр как строковой, потому как ну не существует просто в математике такого числа 01, есть 1. -------------------- менеджер по кодеврайтингу |
|||
|
||||
| nitr |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Bulat, как-то странно ;)
|
||||
|
|||||
| Bulat |
|
||||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Ну дык, в данном случае мы не используем булевскую функцию, т.е. не происходит действия - приведение к типу int поэтому и вывод такой ;) Добавлено через 4 минуты и 13 секунд nitr, да и сдается мне, что в твоем примере выводится не число "0.0", а строка содержащая "0.0" -------------------- менеджер по кодеврайтингу |
||||||
|
|||||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 37 Всего: 84 |
Bulat, правильно подметили
|
|||
|
||||
| ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Bulat, открою Вам секрет: в Perl в булевом контексте не происходит приведение к целому типу. Если бы это происходило, то "0.0" и "00" были бы false.
Это сообщение отредактировал(а) ginnie - 4.6.2008, 13:12 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
| Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
ginnie, обрати внимание как ты задаешь скаляр, и вспомни еще раз мои предыдущие три примера
Добавлено через 5 минут и 12 секунд про переменные в перл например
Т.е. преобразование происходит независимо от того в булевском контексте или нет. При этом всегда Добавлено через 6 минут и 18 секунд
Даже так, весь абзац -------------------- менеджер по кодеврайтингу |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Bulat, мы об одном говорим, или о разном?
в примерах
никаких преобразований строк в числа, дробных чисел в целые и наоборот не происходит. Происходит только интерпретация этих значений в true и false. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
Ок. тогда объясни мне как происходит интерпретация в true или false. Исходя из твоей логики -------------------- менеджер по кодеврайтингу |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Bulat, я с этого и начал топик. Дальше ты сказал про интуицию и началась дисскусия...
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
ginnie, ок, тогда взглянем на твой код по иному
-------------------- менеджер по кодеврайтингу |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Bulat, какие выводы из полученного результата можно сделать?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: 5 Всего: 57 |
ginnie, что в $a перед строкой warn $a ? 'true' : 'false'; и после. Разве нет никаких изменений??
-------------------- менеджер по кодеврайтингу |
|||
|
||||
| gcc |
|
||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
defined($value) вместо undef...? Это сообщение отредактировал(а) gcc - 11.10.2008, 07:52 |
||||
|
|||||
| KSURi |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Ээ, чего? Привидите полный пример кода с комментарием, а то я что-то не догадался...
-------------------- Died at Life.pl line 21 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
может возвращать пустую строку ''
можно сделать еще так $value = $cgi->param('value'); if (defined($value)) { print "не пустая";} Это сообщение отредактировал(а) gcc - 11.10.2008, 10:49 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
я написал вот так:
нужно ли еще что-то фильтровать? Это сообщение отредактировал(а) gcc - 8.8.2009, 02:29 |
|||
|
||||
| gcc |
|
||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
подскажите, если я получаю из СУБД int значение 1 или 0
как тут нужно писать правильный? можно ли так
в чем разница между этими записями? я видел что пишут $int == 1, но если стоит 0, то это будет в любом cлучае FALSE? даже если там и undef? Это сообщение отредактировал(а) gcc - 14.8.2009, 02:18 |
||||
|
|||||
| shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
||||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
то есть то что я спрашивал без разницы...
|
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
а подскажите есть я напишу так:
и если через LWP передам несколько миллионов параметров без значения, то скрипт на perl такой сделает хэш в соответсвенно в порядок 100 000 000 ключей? или нет, это безопасно? Это сообщение отредактировал(а) gcc - 21.9.2009, 06:01 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
есть вопрос, наверное не понял
есть переменная $in которая может быть 0, 1 и не нашлась в базе! как проверить физическое значение? если есть эти 3 типа!! $in = $c->model('DBI')->dbh->selectrow_array($m); как проверить что она пустая, если в базе не нашлась? if ($in == 0) if ($in == 1) ==== проверить что пустая не получается: if ($i == undef) if ( defined $i) оно равняется единицпе или нулю, одновременно!! как тут проверить что в базе не нашлась? Это сообщение отредактировал(а) gcc - 15.11.2009, 05:40 |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 38 Всего: 50 |
||||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
amg, спасибо, я хотел просто сделать максимально красиво и запутался на этом....
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |