Hash输出的Perl Hash

时间:2012-10-08 16:25:36

标签: perl hash

我正在读一个文件。我想要一个散列,它给出了第一行数作为该行其余部分的所有数字的散列的关键字为1.

我相信我正确地添加了哈希,因为Dumper正确打印。 但是,打印“$ first $ secondID \ n”并没有给我任何输出。

while (<FILE>) {

    chomp $_;

    if (/(\d+)\t(.+)/) {

        $firstNum = $1;
        @seconds  = split(/\,/,$2);

        foreach $following (@seconds) {

            $Pairs->{$firstNum}{$following} = 1;
        }

        foreach $first (sort {$a <=> $b} keys %Pairs) {

            print "$first\n";
            %second = {$Pairs{$first}};

            foreach $secondID (sort {$a <=> $b} keys %second) {

                print "$first $secondID\n";
            }
        }
        print Dumper($Pairs);
    }
    else {

        print "ERROR\n";
    }
}

稍后,给出一对数字,我想查看$ Pairs {$ num1} {$ num2}是否已定义。我会写吗

if(defined $Pairs{$num1}{$num2})

或者我应该先检查第一个键。然后检查第二个键

if (defined $Pairs{$num1}) {

    $temp = $Pairs{$num1};
    if (defined $temp{$num2}) {

        print "true\n;
    }
}

3 个答案:

答案 0 :(得分:0)

my %hash;
while ( <> ) {
  my @numbers = split /\D+/;
  my $key     = shift @numbers;
  @{$hash{$key}}{ @numbers } = ( 1 ) x @numbers;
}


# test it this way...
if ( $hash{ $num1 }{ $num2 } ) { 

}

答案 1 :(得分:0)

使用:

%second = %{$Pairs->{$first}};

答案 2 :(得分:0)

你有几个错误。首先,您似乎不确定是使用%Pairs还是$Pairs来存储哈希,其次是%second = {$Pairs{$first}},它会尝试为哈希值{{1}分配哈希引用}。大概你想要%second

您应该在所有Perl程序的开头始终 my %second = %{ $Pairs{$first} }use strict,并使用use warnings在首次使用时声明所有变量。这会提醒您容易忽略的简单错误,并且会在此程序中显示您对my%Pairs的使用,以及您尝试分配单个值(哈希)参考)到哈希。

您应该在$Pairs中保存对它的引用,而不是复制整个哈希。然后,您可以在以下$seconds循环中取消引用它。

经验丰富的Perl程序员还要感谢您对本地(for)变量使用小写加下划线,并为包名和类名保留大写字母。

此程序按预期工作,并期望文件名作为命令行参数:

my