Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何将哈希引用传递给子例程_Perl - Fatal编程技术网

Perl 如何将哈希引用传递给子例程

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

我被一个问题缠住了。我试图引用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", %$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
进行比较只会比较每个哈希的键数。不能使用单个运算符比较字符串列表;你需要一个循环。您还需要使用
排序
,以便两个散列的元素顺序相同。这是家庭作业问题吗?