快速查看您的 ID 列表:
a foo
a bar
a foo2
b bar2
c bar2
c foo3
d bar3
看来a 可以同时是foo 和bar。第二列是唯一的,但不是第一列。但是,您的其他列表如下所示:
a
b
d
这似乎是说第一列(不是唯一的)是键。当我在第一个列表中阅读a 时,我应该返回什么。我是否同时返回 foo 和 bar,还是这是一个错误?
在我们给你答案之前我需要知道这一点。
附录
我需要退回他们两个。很抱歉造成混乱
好的,在 Perl 中,存储关键信息的最简单方法是使用 Hash。哈希的问题是每个键只有一个值。在您的文件中,情况并非如此,每个键都有两个单独的值。有两种处理方法:
方法#1:将值附加到前一个值
open (ID_FILE, "id_file.txt")
or die qq(Can't open "id_file.txt" for reading\n);
my %idHash;
while (my $line = <ID_FILE>) {
chomp $line;
my ($key, $value) = split("/s+", $line);
if (exists $idHash{$key}) {
$idHash{$key} .= " " . $value;
}
else {
$idHash{$key} = $value;
}
}
close ID_FILE;
在循环结束时,$idHash{'a'} = foo bar。因此,在您的第二个循环中:
open (ID_LIST, 'list_of_ids.txt')
or die qq(Can't open "list_of_ids.txt" for reading\n);
while (my $line = <ID_LIST>) {
chomp $line;
print qq("$line" keys are "$idHash{$line}"\n);
}
方法#2:存储哈希列表
这是一个危险的领域。它增加了混乱,我通常建议您在进入哈希列表或列表哈希等时考虑面向对象编程。
open (ID_FILE, "id_file.txt")
or die qq(Can't open "id_file.txt" for reading\n);
my %idHash;
while (my $line = <ID_FILE>) {
chomp $line;
my ($key, $value) = split("/s+", $line);
push(@{$idHash{$line}}, $value);
}
close ID_FILE;
@{$idHash{$line}} 将哈希值视为对哈希的引用,如果更清楚,您可以这样分隔:
open (ID_FILE, "id_file.txt")
or die qq(Can't open "id_file.txt" for reading\n);
my %idHash;
while (my $line = <ID_FILE>) {
chomp $line;
my ($key, $value) = split("/s+", $line);
my @tempList = \$idHash{$line};
push(@tempList, $value);
}
close ID_FILE;
现在,当您进行查找时,您必须浏览列表:
open (ID_LIST, 'list_of_ids.txt')
or die qq(Can't open "list_of_ids.txt" for reading\n);
while (my $line = <ID_LIST>) {
chomp $line;
my @tempList = \$idHash{$line};
print "The values for key $line are " . join(", ", @tempList) . "\n";;
print "The values for key $line are " . join(", ", @{$idHash{$line}) . "\n";
}
或者,您可以解析每个键的列表项,而不是 join:
open (ID_LIST, 'list_of_ids.txt')
or die qq(Can't open "list_of_ids.txt" for reading\n);
while (my $line = <ID_LIST>) {
chomp $line;
foreach my $value (@{$idHash{$line}) {
print qq(Value: $line" \t key "$value"\n);
}
}
顺便说一句,很抱歉,由于时间不够,我没有测试代码。因此,我可以保证到处都有语法错误和错误。但是,它确实让您大致了解如何使用 Perl 哈希通过键快速提取值,以及如何为单个键存储多个值。
看起来原来的 Python 答案也遇到了同样的问题。但是,修改后的看起来是正确的。