我正在读一个文件。我想要一个散列,它给出了第一行数作为该行其余部分的所有数字的散列的关键字为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;
}
}
答案 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