Ошибка при доступе к массиву хэшей

Я пытаюсь сгенерировать список хэшей, взаимодействуя с пользователем, используя следующий скрипт:

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, чтобы помочь вам увидеть содержимое там.

Другие вопросы по тегам