【问题标题】:What is wrong with my hash of hash code?我的哈希码有什么问题?
【发布时间】:2013-02-01 18:35:55
【问题描述】:

谁能告诉我哪里错了?我想不通…… 基本上我的代码试图做的是读取文件并为每个文件创建一个散列,这些散列被组织成散列。用户会输入两个参数,一个是外层哈希的键,另一个是内层的。 我输入的是city和PIT;和我在断线前写的参数一样....

我尝试了数千次,我一直收到此错误:不能使用未定义的值作为 HASH 引用我已在代码中注释掉该行。 这两个文件是city.txt;学校.txt。 它们的内容如下: 坑\t匹兹堡 纽约\t纽约

#!/bin/perl -w
use strict;
use Data::Dumper;
our %hash_all = ();
sub readHash{
    my @vars = @_;
    my $filename = $vars[0];
    my %iptable = ();
    if(open(IN,$filename.".txt")) {
            while(<IN>) {   
            my @tmp = split(/\t/);
            $iptable{$tmp[0]} = $tmp[1];
        }
    }
    return %iptable;
}

sub loadAll{
        my %school = readHash("school");
    my %city = readHash("cities");
    $hash_all{school} = \%school;
    $hash_all{city} = \%city;
    print Dumper(\%hash_all);
}

 sub queryValue{
    my @pars = @_;
    my $key1 = $pars[0];
    my $key2 = $pars[1];

    print "key1".$key1;
    print "key2".$key2;
    print Dumper(\%hash_all);   
    my %temp = %{$hash_all{"city"}};#THIS LINE WORKS
    print $temp{"PIT"}; #THIS LINE WORKS
    my %temp2 = %{$hash_all{$key1}};#THIS LINE HAS AN ERROR
    print $temp2{$key2};
}

loadAll();
my $par1 = <>;
my $par2 = <>;
queryValue($par1,$par2);

【问题讨论】:

  • 错误告诉您$key1 未定义。如果您进行一些回溯,您可以看到$key1 来自queryValue 的第一个参数,即$par1。这是您输入的第一行,所以我怀疑您输入程序输入的方式有问题。您能否与我们分享您执行脚本的代码以及输入文件?
  • @Mattrition:这不是错误消息所说的,因为$key1 没有被用作哈希引用。问题是$hash_all{$key1} 是未定义的,所以$key1 的值很可能与%hash_all 的任何键都不对应。
  • @Borodin Doh,我的错!

标签: perl hash


【解决方案1】:

您的问题可能是当您阅读$par1$par2 时,它们的末尾包含换行符。所以你最终会寻找像"city\n" 这样的哈希键,它与"city" 不同。

确保在输入参数上使用chomp,例如chomp($par1)。那应该会处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2015-10-25
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多