Почему он печатает все три заявления о печати?

my %hash = ( 0=> , 1=>"Man");
my $key=0;
print "Exists\n"    if exists $hash{$key};
print "Defined\n"   if defined $hash{$key};
print "True\n"      if $hash{$key};

Почему вышеуказанный код Perl печатает все три оператора печати?

Он должен печатать только Exists, не так ли?

Ответ 1

use strict; use warnings;. Всегда.

Ваша хэш-декларация не делает то, что, по вашему мнению, она делает, имеет нечетное количество элементов.

Попробуйте следующее:

use Data::Dumper;
my %hash = ( 0=> , 1=>"Man");
print Dumper(%hash);

Вы увидите, что $hash{0} установлен в 1, $hash{"Man"} существует, но есть undef, а $hash{1} вообще не существует. т.е. ваша хэш-декларация эквивалентна:

my %hash = (0 => 1, "Man" => undef);

Почему это происходит? Это потому, что:

=> по существу является эквивалентом , Конструкторы значений списка работают таким образом, например. ($a,,$b) эквивалентно ($a,$b)

Соответствующие кавычки из этого документа:

Оператор => в основном представляет собой скорее более визуально отличительный синоним для запятой, но также упорядочивает его левый операнд, который будет интерпретироваться как строка, если это будет гоночное слово, которое будет юридический простой идентификатор.

и

Нулевой список представлен (). Интерполирование его в списке не влияет. Таким образом, ((),(),()) эквивалентно (). Точно так же интерполяция массива без элементов такая же, как если бы ни один массив не был интерполирован в этой точке.

(...)

Список 1,,3 представляет собой конкатенацию двух списков: 1, и 3, первая из которых заканчивается эта дополнительная запятая. 1,,3 (1,),(3) 1,3 (И аналогично для 1,,,3 (1,),(,),3 1,3 и т.д.) Не то, чтобы мы советовали вам использовать эту обфускацию.

Примените это к вашему коду:

   (0 => , 1 => "Man");
is (0 , , 1 , "Man");
is (0 , 1 , "Man");

Ответ 2

Всегда, всегда, ВСЕГДА use strict; и use warnings; в вашем коде:

use strict;
use warnings;

my %hash = ( 0=> , 1=>"Man");
my $key=0;
print "Exists\n"    if exists $hash{$key};
print "Defined\n"   if defined $hash{$key};
print "True\n"      if $hash{$key};

Вывод:

Odd number of elements in hash assignment at - line 3.

Если вы хотите, чтобы элемент существовал, но не определялся, используйте undef:

my %hash = ( 0=> undef, 1=>"Man");

Ответ 3

use warnings;, и вы увидите Odd number of elements in hash assignment.

Что это! У вас есть (0 = > 1, "Man" = > undef).

Ответ 4

Попробуйте включить предупреждения. Эта строка

my %hash = ( 0=> , 1=>"Man");

создает хэш (0 = > '1', 'Man' = > undef);