Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> О скалярных значениях в булевом контексте, это должен помнить каждый :о) 
:(
    Опции темы
ginnie
Дата 3.6.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемые коллеги! В разделе вакансий Perl-разработчиков на Яндексе публикуются тестовые задания. Одно из заданий такое

Что напечатает программа?

Код

$a = "000";
if ($a) {
    print "A";
} else {
    print "B";
}


Как обычно, если чем-то часто не пользуешься, то со временем оно забывается. Так и в данном случае из головы выветрилось, какие скалярные значения являются false в булевом контексте.
Цитата из  Уолл Л., Кристиансен Т., Орвант Д. Программирование на Perl (3-е издание):

Цитата

...скалярное значение является истинным, если оно не равно нулевой строке "" или числу 0 (или его строковому эквиваленту, "0"). Ссылка всегда истинна, поскольку представляет адрес, не могущий быть 0. Неопределенное значение (часто обозначаемое undef) всегда ложно, поскольку является "" или 0, в зависимости от того, рассматривается ли это значение как строка или как число...
Поскольку булев (логический) контекст является безразличным контекстом, он не вызывает преобразования скаляров...



Соответственно значение "0" в булевом контексте будет false, а "00" и "000" - true. Из-за подобной забывчивости можно делать ошибки, аналогичные такой:

Код

my $value = $cgi->param('value'); # значение из формы
if ($value) {
    $result = 100 / $value;
}



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 3.6.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Поэтому я делаю
Код

my $value = $cgi->param('value') || undef;

Но кстати, стоит отметить, что CGI.pm возвращает '' (пустую строку), если параметр в запросе присутствует, но значение у него пустое. А вот если параметра в запросе вообще нет, то тогда вернет undef


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
tolkien
Дата 4.6.2008, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Все книги по CGI пестрят рекомендациями о необходимости фильтрации входных данных. В указанном выше примере как раз это не сделанно. 
PM MAIL   Вверх
ginnie
Дата 4.6.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый KSURi, я как раз об этом и написал, что не сразу видно проблему.

Код

my $test = '00';
warn($test || '1');


этот код вернет 00, т.к. он true в булевом контексте


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Вопрос конечно интересный, и легко ошибиться, только вот интуиция всегда подсказывает, что 0 - это ноль, а "000" - не совсем понятно что, чисто с математической точки зрения. В математике нет такого 000, а значит 000 не равно(не тождественно равно, если угодно) 0, но false только в случае когда 0, и значит вероятнее всего что "000" даст true. Что на практике и оказывается так smile

Может немного сумбурно, но думаю все же понятно smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 4.6.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый Bulat, объяснение очень натянутое, т.к.

Код

my $test = '000';
warn($test == 0 ? 'equal' : 'not equal');


т.к. Perl считает, что "000" и 0 с математической точки зрения (т.е. при приведении к одному типу - числу) тождественно равны.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(ginnie @  4.6.2008,  09:26 Найти цитируемый пост)
Уважаемый Bulat, объяснение очень натянутое, т.к.

Не согласен. 

Цитата(ginnie @  4.6.2008,  09:26 Найти цитируемый пост)
т.к. Perl считает, что "000" и 0 с математической точки зрения (т.е. при приведении к одному типу - числу) тождественно равны. 


Булевая проверка - это одно действие, а приведение к одному типу совсем иное. Разные операции выполняются над одним и тем же объектом, что есс-но может выдать два противоположных результата smile




--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
KSURi
Дата 4.6.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



ginnie, вот я видимо не сразу увидел, в чем вы обозначили проблему)
Ни разу просто не сталкивался с ситуацией, когда в параметре "000" передается

Это сообщение отредактировал(а) KSURi - 4.6.2008, 09:54


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 4.6.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый Bulat, давайте пойдем от обратного: возьмем для примера число 0.0, которого, по аналогии с 000 тоже нет. С математической точки зрения, по Вашему алгоритму, оно должно, вероятнее всего, быть true. Но это не так (так-же, как и в случае с 000). True оно будет только если его представить в виде строки "0.0", но это уже не математика  smile Это Perl, где кроме как запомнить, что false в булевом контексте дают только строки "" и "0" других способов я не вижу.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



ginnie, 0.0 - не являетс переменной типа int smile double - в яве(я этот язык довольно не плохо знаю).

А булевы функции не стоит отождествлять с перлом smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 4.6.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Уважаемый Bulat, при чем тут int и double? В булевом контексте числа 0, 0.0, 0.00, 00, 000 имеют значение false.

Цитата

А булевы функции не стоит отождествлять с перлом

Мы обсуждаем не булевы функции, а булев контекст. Причем именно применительно к Perl. О каком отождествлении идет речь?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



ginnie, Булева функция

Мне хотелось бы посмотреть, где  в булевой функции или алгебре вы видели числа 0.0, 000, 0.00 и т.п. smile Там есть только 1 и 0. Да, perl при использовании булевской функции итерпретирует 0.0, 000 и т.п. с 0, НО интерпретирует, а не тождественно равно. 0.0, 000, 0.00 - это совершенно разные числа, не тождественно равные 0. Что наглядно демонстрируется в иных языках, где нужно явно указывать типа любой перемнной, поэтому есть типы int, string, double. Не нужно забывать, что и при 000 и при 0.0 происходит приведение типов, т.е. меняются свойства объекта, а значит уже должен быть повод усомнится в том, будет ли возвращено false, даже если после приведения типов получается 0 smile

Добавлено через 7 минут и 52 секунды
Код

my $a = 0.0;

unless ($a) {
  print $a, "\n";
}


Код

my $a = '000';

if ($a) {
  print $a, "\n";
}


Код

my $a = 0;

unless ($a) {
  print $a, "\n";
}


Обрати внимание что выводится как $a  в каждом из трех примеров. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 4.6.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Bulat, спасибо за ссылку, но булевы функции к нашему разговору отношения не имеют. Мы обсуждаем какие значения Perl интерпретирует как true, а какие - false. 
Извините за нескромный вопрос: какой, по Вашему мнению, критерий тождественного равенства двух чисел в конкретном языке программирования? И почему 000 тождественно не равно 0?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



ginnie, Если начинать размышления не отталкиваясь от перла, а именно от булевских функций, то ошибится сложнее.

В перле нет деления на типы перемнных, есть скаляры. Но в булевом контексте "000" будет интерпретироватся не как числовой тип, а как строковой тип. Поэтому в перл "000" не тождественно равно "0". А что касается других языков, там-то как раз все проще, потому как и "0" числового типа и "000" числового типа действительно тождественно равны, потому что они оба числовые типы(int). Вся суть лишь в том, как интепретирует перл тот или иной скаляр в булевом контексте. Собственно основным критерием как раз и является тип перемнной, в случае с перлом - скаляра. И даже, что касается "0.0", как видно из выше мною приведенных примеров, в булевом контексте опять же "0.0" (тип double) предварительно приводится к типу (int), что подверждает последующий print , где на выходе уже не "0.0", а "0".smile

P.S. все же не стоит забывать, что даже если в перле нет необходимости указывать явно тип перемнной(скаляра), этого нет вообще. За нас это делает интерпретатор smile

Добавлено через 5 минут и 32 секунды
Проще говоря, в языках где нужно явно указывать тип перемнной, можно присвоить перемнной типа int значение "01", но язык это приведет к виду "1" без 0 идущим перед 1.

Перл же посчитает такой скаляр как строковой, потому как ну не существует просто в математике такого числа 01, есть 1. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
nitr
Дата 4.6.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Цитата(Bulat @  4.6.2008,  11:58 Найти цитируемый пост)
где на выходе уже не "0.0", а "0".smile
Bulat, как-то странно ;)
Код

#!perl
print "0.0";

Цитата
0.0





--------------------
PM   Вверх
Bulat
Дата 4.6.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(nitr @ 4.6.2008,  12:15)
Bulat, как-то странно ;)
Код

#!perl
print "0.0";

Цитата
0.0

Ну дык, в данном случае мы не используем булевскую функцию, т.е. не происходит действия - приведение к типу int поэтому и вывод такой ;)

Добавлено через 4 минуты и 13 секунд
nitr, да и сдается мне, что в твоем примере выводится не число "0.0", а строка содержащая "0.0" smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
nitr
Дата 4.6.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Bulat, правильно подметили smile Весь пост про это всё ;)


--------------------
PM   Вверх
ginnie
Дата 4.6.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Цитата

Ну дык, в данном случае мы не используем булевскую функцию, т.е. не происходит действия - приведение к типу int поэтому и вывод такой ;)


Уважаемый Bulat, открою Вам секрет: в Perl в булевом контексте не происходит приведение к целому типу. Если бы это происходило, то "0.0" и "00" были бы false.

Код

warn int('00') ? 'true' : 'false';


Это сообщение отредактировал(а) ginnie - 4.6.2008, 13:12


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



ginnie, обрати внимание как ты задаешь скаляр, и вспомни еще раз мои предыдущие три примера smile

Добавлено через 5 минут и 12 секунд
про переменные в перл

например
Цитата

Все данные в Perl это скаляры, массивы скаляров и хеши скаляров. Скалярные переменные могут содержать числа, строки и ссылки. Преобразование числа - строки происходит автоматически по умолчанию.


Т.е. преобразование происходит независимо от того в булевском контексте или нет. При этом всегда smile

Добавлено через 6 минут и 18 секунд
Цитата

Все данные в Perl это скаляры, массивы скаляров и хеши скаляров. Скалярные переменные могут содержать числа, строки и ссылки. Преобразование числа - строки происходит автоматически по умолчанию. Скаляр может иметь только одно единственное значение, хотя это может быть ссылка на массив скаляров. Так как Perl сам преобразовывает числа в строки и наоборот, то программисту нет необходимости думать о том, что возвращает функция.

В Perl не существует типов "строка" или "число" или "файл" или что-то еще. Это контекстно зависимый полиморфный язык для работы с текстами.

Скаляр имеет логическое значение "TRUE" (истина), если это не нулевая строка или число не равное 0. 


Даже так, весь абзац smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 4.6.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Bulat, мы об одном говорим, или о разном?

в примерах

Код

warn '00' ? 'true' : 'false';
warn 00 ? 'true' : 'false';
warn 0 ? 'true' : 'false';
warn '0' ? 'true' : 'false';
warn '0.0' ? 'true' : 'false';
warn 0.0 ? 'true' : 'false';
warn '' ? 'true' : 'false';
warn undef ? 'true' : 'false';


никаких преобразований строк в числа, дробных чисел в целые и наоборот не происходит. Происходит только интерпретация этих значений в true и false.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(ginnie @  4.6.2008,  13:59 Найти цитируемый пост)
никаких преобразований строк в числа, дробных чисел в целые и наоборот не происходит. Происходит только интерпретация этих значений в true и false. 


Ок. тогда объясни мне как происходит интерпретация в true или false. Исходя из твоей логики smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 4.6.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Bulat, я с этого и начал топик. Дальше ты сказал про интуицию и началась дисскусия...  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



ginnie, ок, тогда взглянем на твой код по иному
Код

my $a = '00';
warn $a ? 'true' : 'false';
print $a, "\n";
$a = 00;
warn $a ? 'true' : 'false';
print $a, "\n";
$a = 0;
warn $a ? 'true' : 'false';
print $a, "\n";
$a = '0';
warn $a ? 'true' : 'false';
print $a, "\n";
$a = '0.0';
warn $a ? 'true' : 'false';
print $a, "\n";
$a = 0.0;
warn $a ? 'true' : 'false';
print $a, "\n";
$a = '';
warn $a ? 'true' : 'false';
print $a, "\n";


Цитата

true at C:\hh.pl line 105.
00
false at C:\hh.pl line 108.
0
false at C:\hh.pl line 111.
0
false at C:\hh.pl line 114.
0
true at C:\hh.pl line 117.
0.0
false at C:\hh.pl line 120.
0
false at C:\hh.pl line 123.






--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 4.6.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Bulat, какие выводы из полученного результата можно сделать?



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Bulat
Дата 4.6.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



ginnie, что в $a перед строкой warn $a ? 'true' : 'false'; и после. Разве нет никаких изменений??


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
gcc
Дата 11.10.2008, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(KSURi @ 12.9.2008,  00:26)

Поэтому я делаю
Код

my $value = $cgi->param('value') || undef;

Но кстати, стоит отметить, что CGI.pm возвращает '' (пустую строку), если параметр в запросе присутствует, но значение у него пустое. А вот если параметра в запросе вообще нет, то тогда вернет undef 


defined($value) вместо undef...?

Это сообщение отредактировал(а) gcc - 11.10.2008, 07:52
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 11.10.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Ээ, чего? Привидите полный пример кода с комментарием, а то я что-то не догадался...


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 11.10.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



может возвращать пустую строку ''
можно сделать еще так $value = $cgi->param('value'); if (defined($value)) { print "не пустая";}

Это сообщение отредактировал(а) gcc - 11.10.2008, 10:49
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 8.8.2009, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



я написал вот так:

Код

sub begin : Private {
    my ( $self, $c ) = @_;

   while (my ($key,$value) = each (%{$c->request->params} )) {
     $value ||= ''; 
    $c->request->params->{$key} = $value;
   }   
}


нужно ли еще что-то фильтровать?

Это сообщение отредактировал(а) gcc - 8.8.2009, 02:29
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 14.8.2009, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



подскажите, если я получаю из СУБД int значение 1 или 0

как тут нужно писать правильный?

можно ли так

Код

$int
!$int


Код

$int == 0
$int == 1


в чем разница между этими записями? я видел что пишут $int == 1, но если стоит 0, то это будет в любом cлучае FALSE? даже если там и undef?

Это сообщение отредактировал(а) gcc - 14.8.2009, 02:18
PM WWW ICQ Skype GTalk Jabber   Вверх
shamber
Дата 14.8.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Цитата(gcc @  14.8.2009,  02:16 Найти цитируемый пост)
даже если там и undef?

а проверить?

Код

my $int;
undef ($int);
if($int==1){
    print "TRUE";
}


Это сообщение отредактировал(а) shamber - 14.8.2009, 09:18
PM MAIL Jabber   Вверх
gcc
Дата 14.8.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



то есть то что я спрашивал без разницы...
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 21.9.2009, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



а подскажите есть я напишу так:
Код

sub begin : Private {
    my ( $self, $c ) = @_;
   while (my ($key,$value) = each (%{$c->request->params} )) {
     $value ||= ''; 
    $c->request->params->{$key} = $value;
   }   
}


и если через LWP передам несколько миллионов параметров без значения, то скрипт на perl такой сделает хэш в соответсвенно в порядок 100 000 000 ключей? или нет, это безопасно?

Это сообщение отредактировал(а) gcc - 21.9.2009, 06:01
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 15.11.2009, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 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
PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 15.11.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(gcc @  15.11.2009,  05:35 Найти цитируемый пост)
есть переменная $in которая может быть 0, 1 и не нашлась в базе!
Вроде, все просто, или я не понял вопрос?
Код
if (defined $in) {
  if ($in == 0) {
    # 0
  }
  elsif ($in == 1)  {
    # 1
  }
  else {
    # что-то другое
  }
}
else {
  # не нашлась в базе
}

PM MAIL   Вверх
gcc
Дата 19.11.2009, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



amg, спасибо, я хотел просто сделать максимально красиво и запутался на этом....
PM WWW ICQ Skype GTalk Jabber   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.