Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Странная работа функции exists


Автор: tolkien 24.12.2008, 15:57
Код

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

Автор: amg 24.12.2008, 16:11
Цитата(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});



Автор: tolkien 24.12.2008, 16:41
Что я имел ввиду я выше написал.

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

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? 

Автор: ginnie 24.12.2008, 16:45
tolkien, посмотрите в http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity на = и на and.

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

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

Код

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

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

Код

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

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

Автор: tolkien 25.12.2008, 02:18
Спс за ответы. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)