Хэш - это просто список пар ключ-значение. Существует синтаксическая конструкция, которая помогает отличать ключи от значений. Он известен как «жирная стрела» =>
. Эта конструкция приводит аргумент левой руки в строку, а затем преобразуется в простую запятую.
Вот что вы хотели написать:
perl -MO=Deparse -e'$s = { a => 1 }'
$s = {'a', 1};
-e syntax OK
Вот что вы на самом деле написали:
perl -MO=Deparse -e'$s = { a = 1 }'
Can't modify constant item in scalar assignment at -e line 1, near "1 }"
-e had compilation errors.
$s = {'a' = 1};
Именно поэтому я бы порекомендовал вам всегда запускать программу Perl с включенными предупреждениями.
perl -w -MO=Deparse -e'$s = { a = 1 }'
Unquoted string "a" may clash with future reserved word at -e line 1.
Can't modify constant item in scalar assignment at -e line 1, near "1 }"
-e had compilation errors.
BEGIN { $^W = 1; }
$s = {'a' = 1};
perl -w -MO=Deparse -e'$s = { a => 1 }'
Name "main::s" used only once: possible typo at -e line 1.
BEGIN { $^W = 1; }
my $s = {'a', 1};
-e syntax OK
Этот последний пример показывает, почему вы должны также use strict
.
perl -w -Mstrict -MO=Deparse -e'$s = { a => 1 }'
Global symbol "$s" requires explicit package name at -e line 1.
-e had compilation errors.
BEGIN { $^W = 1; }
use strict 'refs';
${'s'} = {'a', 1};
Я должен был объявить $s
, прежде чем пытаться его использовать:
perl -w -Mstrict -MO=Deparse -e'my $s = { a => 1 }'
BEGIN { $^W = 1; }
use strict 'refs';
my $s = {'a', 1};
-e syntax OK
Вот почему я всегда запускаю свои Perl-программы с:
use strict;
use warnings;