Perl 如何将哈希引用传递给子例程
我被一个问题缠住了。我试图引用2个哈希,然后在一个子例程中比较它们。但是,有一个错误: 无法在compareHashis.pl第10行将未定义的值用作哈希引用 我的代码是:Perl 如何将哈希引用传递给子例程,perl,Perl,我被一个问题缠住了。我试图引用2个哈希,然后在一个子例程中比较它们。但是,有一个错误: 无法在compareHashis.pl第10行将未定义的值用作哈希引用 我的代码是: use strict; use warnings; use feature qw(say); my $hash_1; my $hash_2; compareHashes($hash_1, $hash_2); sub compareHashes{ say "the first hash:", "\n", %$has
use strict;
use warnings;
use feature qw(say);
my $hash_1; my $hash_2;
compareHashes($hash_1, $hash_2);
sub compareHashes{
say "the first hash:", "\n", %$hash_1;
say "the second hash:", "\n", %$hash_2;
if ((keys(%$hash_1) eq keys(%$hash_2)) and (values(%$hash_1) eq values(%$hash_2))){
say "Two above hashes are equal";}
else {
say "Two above hashes are not equal";
}
};
my %hash1 = (ITALY => "ROME",
FRANCE => "PARIS"
);
my %hash2 = ( ITALY => "MILAN",
FRANCE => "PARIS"
);
my %hash3 = (ITALY => "ROME" );
my %hash4 = (SPAIN => "ROME",
FRANCE => "PARIS"
);
my $hash1_r = \%hash1;
my $hash2_r = \%hash2;
my $hash3_r = \%hash3;
my $hash4_r = \%hash4;
compareHashes ($hash1_r, $hash1_r);
compareHashes ($hash1_r, $hash2_r);
compareHashes ($hash1_r, $hash3_r);
compareHashes ($hash1_r, $hash4_r);
请告诉我怎么了。感谢您的帮助。您从未分配到
$hash_1
和$hash_2
my ($hash_1, $hash_2) = @_;
但是,问题还不止这些,标量上下文中的
键
和值
都返回散列中的元素数,因此您只需检查两个散列的大小是否相同
sub are_hashes_equal {
my ($hash1, $hash2) = @_;
{
my %set;
++$set{$_} for keys(%$hash1);
--$set{$_} for keys(%$hash2);
return 0 if grep { $_ } values(%set);
}
for my $key (keys(%$hash1)) {
return 0 if $hash1->{$key} ne $hash2->{$key};
}
return 1;
}
你根本没有给$hash_1或$hash_2赋值,所以它们是未定义的?也许我可以这样定义。尝试使用打印。是的。我试着比较4个“真实”散列。你的代码乱七八糟。如果函数忽略其参数,则在文件范围中使用未初始化的词法变量,这会给出错误消息。将键与
eq
进行比较只会比较每个哈希的键数。不能使用单个运算符比较字符串列表;你需要一个循环。您还需要使用排序
,以便两个散列的元素顺序相同。这是家庭作业问题吗?