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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странная работа функции exists 
V
    Опции темы
tolkien
Дата 24.12.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

my $h2 = { 'pixel' => { '10' => {'20' => [255, 255, 255] } } };

my $r1 = exists ($h2->{pixel}->{10}) and exists ($h2->{pixel}->{10}->{21});

my $r2 = exists ($h2->{pixel}->{10});
$r2 = exists ($h2->{pixel}->{10}->{21}) if ($r2);

print "r1($r1) r2($r2)\n";


Вывод: r1(1) r2()

В  $r1 и $r2 содержатся разные значения. Я не понимаю это баг Перл или exists это особенная функция. Или в коде допущена ошибка? Я считаю что оба варианта эквиваленты и должны давать один и тот же результат. 
Perl 5.8.8 Windows
PM MAIL   Вверх
amg
Дата 24.12.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(tolkien @  24.12.2008,  15:57 Найти цитируемый пост)
Я не понимаю это баг Перл или exists это особенная функция. Или в коде допущена ошибка?
Ни первое, ни второе. Скорее третье (а именно, смысловая ошибка). Возможно, Вы имели в виду
Код
my $r1 = (exists($h2->{pixel}->{10}) and exists($h2->{pixel}->{10}->{21}));
my $r1 = exists($h2->{pixel}->{10}) && exists($h2->{pixel}->{10}->{21});



PM MAIL   Вверх
tolkien
Дата 24.12.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что я имел ввиду я выше написал.

Ваш пример 
Код

my $r1 = (exists($h2->{pixel}->{10}) and exists($h2->{pixel}->{10}->{21}));

Работает. Но это ужасно. Почему нужен такой спец подход к этой функции? Окружать все выражение скобками. 

Пример 1
Код

my $r1 = exists($h2->{pixel}->{10}) && exists($h2->{pixel}->{10}->{21});


Почему он в таком ввиде работает, а в таком нет

Пример 2
Код

my $r1 = exists($h2->{pixel}->{10}) and exists($h2->{pixel}->{10}->{21});


Я не вижу разницы в этих выражениях. Они должны давать все один и тот же результат. Если есть разница прошу объяснить.  В чем смысловая разница у пример 1 и примера 2? 

PM MAIL   Вверх
ginnie
Дата 24.12.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



tolkien, посмотрите в таблице приоритетов операторов на = и на and.

P.S. сам на такую ошибку несколько раз попадал.

P.P.S. Уже несколько раз упоминал полезное средство для непонятных случаев

Код

perl -MO=Deparse,-p -e 'my $r1 = exists ($h2->{pixel}->{10}) and exists ($h2->{pixel}->{10}->{21});'


Это сообщение отредактировал(а) ginnie - 24.12.2008, 16:51


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


Опытный
**


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

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



Цитата(tolkien @  24.12.2008,  16:41 Найти цитируемый пост)
Почему нужен такой спец подход к этой функции? Окружать все выражение скобками. 

Код

my $r1 = exists $h2->{pixel}->{10} & exists $h2->{pixel}->{10}->{21};



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


Эксперт
***


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

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



Цитата(tolkien @  24.12.2008,  16:41 Найти цитируемый пост)
Что я имел ввиду я выше написал.
Выше вы (фактически) написали 
Код
(my $r1 = exists($h2->{pixel}->{10})) and exists($h2->{pixel}->{10}->{21});
в чем легко убедиться, последовав совету ginnie. Довольно странная и бесполезная конструкция, поэтому я и позволил себе предположить, что Вы имели в виду не ее.

PM MAIL   Вверх
tolkien
Дата 25.12.2008, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спс за ответы. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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