Почему он печатает все три печатных заявления? - PullRequest
10 голосов
/ 16 мая 2011
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 печатает все три оператора печати?

Он должен печатать только существует, не так ли?

Ответы [ 4 ]

22 голосов
/ 16 мая 2011

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");
9 голосов
/ 16 мая 2011

Всегда, всегда , ВСЕГДА 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");
4 голосов
/ 16 мая 2011

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

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

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

4 голосов
/ 16 мая 2011

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

Вот и все!У вас есть (0 => 1, "Человек" => undef).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...