我正在尝试生成一个哈希列表,使用以下脚本与用户交互:
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.
答案 0 :(得分:2)
参考找到了generate_hashes.pl第21行预期的偶数大小的列表,&lt;&gt;第1行。
那个是由于
my %new_hash = {};
空花括号{}
提供对空哈希的引用,但在左侧,您有哈希,而不是对哈希的引用。您可以使用以下方式初始化:
my %new_hash = ();
但是(如评论所示)如果你想以空哈希开始,你实际上不需要初始化;这是默认值。
参考找到了在generate_hashes.pl第12行预期的偶数大小的列表,&lt;&gt;第3行。
generateHash
函数中的上述错误。
在这一行:
push (@hashes, %new_hash);
我怀疑你打算将哈希引用推送到数组中,为此你需要添加\
:
push( @hashes, \%new_hash );
否则你将把整个数据结构放在数组等中。
在这一行:
my %test = $hashes[0];
您的右侧是标量,是对散列的引用,因此您需要取消引用以在分配中使用该散列:
my %test = %{$hashes[0]};
等消息
HASH(0x2587a88)
来自这一行:
打印“@hashes \ n”;
不确定你的目的是什么,但如果你想看到内容(它将是一个对哈希的引用数组),你需要迭代数据结构。您可以考虑使用Data :: Dumper模块来帮助您查看其中的内容。