哈希输出的Perl哈希



我正在读取一个文件。我想要一个散列,它给我一行的第一个数字,作为将该行其余部分的所有数字散列为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 "$firstn";
%second = {$Pairs{$first}};
foreach $secondID (sort {$a <=> $b} keys %second) {
print "$first $secondIDn";
}
}
print Dumper($Pairs);
}
else {
print "ERRORn";
}
}

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

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

或者我应该先检查第一把钥匙。然后检查第二个密钥

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

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

您应该在所有Perl程序开始时始终use strictuse warnings,并在首次使用my时声明所有变量。这将提醒您注意可能容易忽略的简单错误,并显示您在该程序中同时使用%Pairs$Pairs,以及您试图为哈希分配单个值(哈希引用)。

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

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

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

use strict;
use warnings;
my %pairs;
while (<>) {
unless ( /(d+)s+(.+)/ ) {
print "ERRORn";
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 "$firstn";
my $second = $pairs{$first};
foreach my $second_id (sort { $a <=> $b } keys %$second) {
print "$first $second_idn";
}
}
}
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 } ) { 
}

使用:

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

最新更新