0

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

我相信我正确地添加了哈希,因为 Dumper 打印正确。但是, print "$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;
    }
}
4

3 回答 3

0

你有几个错误。首先,您似乎不确定您是在使用%Pairs还是$Pairs存储您的哈希,其次您有%second = {$Pairs{$first}},它试图为哈希分配一个哈希引用%second。想必你想要my %second = %{ $Pairs{$first} }

您应该始终 use strict在所有 Perl 程序的开头,并use warnings在第一次使用时声明所有变量使用my. 这将提醒您注意可能很容易忽略的简单错误,并且会显示您在此程序中使用%Pairs$Pairs,以及您尝试将单个值(哈希引用)分配给哈希。

与其复制整个散列,不如将它的引用保存在$seconds. 然后你可以在下面的for循环中取消引用它。

有经验的 Perl 程序员也会感谢您为局部 ( ) 变量使用小写加下划线my,并为包名和类名保留大写字母。

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

use strict;
use warnings;

my %pairs;

while (<>) {

  unless ( /(\d+)\s+(.+)/ ) {
    print "ERROR\n";
    next;
  }

  my $first_num = $1;
  my @seconds = split /,/, $2;

  foreach my $following (@seconds) {
    $pairs{$first_num}{$following} = 1;
  }

  foreach my $first (sort { $a <=> $b } keys %pairs) {
    print "$first\n";
    my $second = $pairs{$first};
    foreach my $second_id (sort { $a <=> $b } keys %$second) {
      print "$first $second_id\n";
    }
  }

}
于 2012-10-08T17:21:11.833 回答
0

利用:

%second = %{$Pairs->{$first}};
于 2012-10-08T17:17:40.247 回答
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 } ) { 

}
于 2012-10-08T17:11:44.863 回答