Ошибка при доступе к массиву хэшей
Я пытаюсь сгенерировать список хэшей, взаимодействуя с пользователем, используя следующий скрипт:
use strict;
use warnings;
my $KEY_1 = "one";
my $KEY_2 = "two";
sub generateHash{
my ($value1, $value2) = (@_);
$value2 = $value1 + 5.0;
my %hash = {};
$hash{$KEY_1} = $value1;
$hash{$KEY_2} = $value2;
return %hash;
}
print "Num: \n";
my $number = <>;
my @hashes = ();
my %new_hash = {};
for ( my $i = 1; $i < $number + 1; $i = $i + 1 ) {
print "Enter the values $i \n";
print "value 1: ";
my $value1= <>;
print "\nvalue 2: ";
my $value2= <>;
chomp $value1;
chomp $value2;
%new_hash = generateHash($value1, $value2);
push (@hashes, %new_hash);
print "@hashes\n";
}
my %test = $hashes[0];
my @keys = keys %test;
my @values = values %test;
print "@keys\n";
print "@values\n";
Когда я пытаюсь выполнить программу, она вызывает некоторые ошибки, связанные с использованием ссылок при доступе к хешам в массиве. Я что-то упускаю, но не вижу, что, мне интересно, где я получаю ссылку на хэш. Заранее спасибо, прилагается выход из исполнения:
Num:
1
Reference found where even-sized list expected at generate_hashes.pl line 21, <> line 1.
Enter the values 1
value 1: 1
value 2: 1
Reference found where even-sized list expected at generate_hashes.pl line 12, <> line 3.
Use of uninitialized value $hashes[1] in join or string at generate_hashes.pl line 32, <> line 3.
HASH(0x2587a88) one 1 two 6
Odd number of elements in hash assignment at generate_hashes.pl line 34, <> line 3.
HASH(0x2587a88)
Use of uninitialized value $values[0] in join or string at generate_hashes.pl line 38, <> line 3.
1 ответ
Обнаружена ссылка, где ожидается список четного размера в файле generate_hashes.pl 21, <> строка 1.
Это связано с
my %new_hash = {};
Пустые фигурные скобки {}
предоставьте ссылку на пустой хеш, но с левой стороны у вас есть хеш, а не ссылка на него. Вместо этого вы можете инициализировать, используя:
my %new_hash = ();
Но (как прокомментировано) на практике вам не нужно инициализироваться, если вы хотите начать с пустого хэша; это по умолчанию.
Обнаружена ссылка, где ожидается список четного размера в файле generate_hashes.pl, строка 12, строка> 3.
Та же ошибка, что и выше внутри generateHash
функция.
В этой строке:
push (@hashes, %new_hash);
Я подозреваю, что вы намереваетесь вставить ссылку на хеш в массив, для этого вам нужно добавить \
:
push( @hashes, \%new_hash );
В противном случае вы поместите всю структуру данных в массив и т. Д.
В этой строке:
my %test = $hashes[0];
Ваша правая часть - скаляр, ссылка на хеш, поэтому вам нужно разыменовать, чтобы использовать этот хеш в присваивании:
my %test = %{$hashes[0]};
Сообщения как
HASH(0x2587a88)
Исходите из этой строки:
напечатайте "@hashes\n";
Не уверен, что вы намерены, но вам нужно перебрать структуру данных, если вы хотите увидеть содержимое (это будет массив ссылок на хэши). Вы могли бы рассмотреть возможность использования модуля Data::Dumper, чтобы помочь вам увидеть содержимое там.