作为初学者,我遇到了一个我认为相当复杂的问题,希望有人能提供帮助。
我有以下文本文件(制表符分隔)...
FILE1.txt
Dog Big
Dog Medium
Dog Small
Rabbit Huge
Rabbit Tiny
Rabbit Middle
Donkey Massive
Donkey Little
Donkey Gigantic
我需要将 FILE1.txt 读取到哈希引用中以获得类似以下内容...(使用 Data::Dumper)
$VAR1 = {
'Dog' => {
'Big',
'Medium',
'Small'
},
'Rabbit => {
'Huge',
'Tiny',
'Middle'
},
'Donkey => {
'Massive',
'Little',
'Gigantic'
},
};
我遇到的问题:
然后我需要一次遍历哈希引用的每个分支,我将使用哈希引用中的值来检查它是否与我的关键字匹配,如果匹配则返回它对应的键....例如……
我需要它做什么:
my $keyword == "Little";
Dog->Big
if 'Big' matches my keyword then return $found = Dog
else go to the next branch
Rabbit->Huge
if 'Huge' matches my keyword then return $found = Rabbit
else go to the next branch
Donkey->Massive
if 'Massive' matches my keyword then return $found = Donkey
else go to the next branch (which is Dog again, but the second element this time)
Dog->Medium
if 'Medium' matches my keyword then return $found = Dog
else go to the next branch
Rabbit->Tiny
if 'Tiny' matches my keyword then return $found = Rabbit
else go the the next branch
Donkey->Little
if 'Little' matches my keyword then return $found = Donkey
..... 以此类推,直到找到关键字或我们到达哈希引用的末尾
这是我正在努力实现的事情,但不知道如何去做,或者哈希引用是否是最好的方法,或者是否可以用哈希/哈希引用?
非常感谢你的帮助,谢谢
最佳答案
选择合适的数据结构通常是解决问题的关键步骤,但首先您应该定义要实现的目标。什么是总体目标?例如,我有这个数据文件,在我的应用程序/程序中,我需要经常询问这些信息。提出正确的问题至关重要,因为例如,如果您不需要经常询问关键字,那么创建哈希根本没有意义。
perl -anE'say $F[0] if $F[1] eq "Little"' FILE1.txt
是的,就是这么简单。在 perlrun
联机帮助页中查找开关及其含义以及如何在更大的应用程序中执行相同的操作。
如果你需要经常问这个问题,你应该以对你有帮助的方式安排你的数据,而不是你不得不与之抗争的方式。
use strict;
use warnings;
use feature qw(say);
use autodie;
open my $f, '<', 'FILE1.txt';
my %h;
while(<$f>) {
chomp;
my ($animal, $keyword) = split' ';
$h{$keyword} = $animal unless exists $h{$keyword};
}
close $f;
for my $keyword (qw(Little Awkward Small Tiny)) {
say $h{$keyword} ? "$keyword $h{$keyword}" : "keyword $keyword not found";
}
但是如果你仍然坚持要遍历哈希你可以这样做但是你已经被警告了。
open my $f, '<', 'FILE1.txt';
my %h;
while (<$f>) {
chomp;
my ( $animal, $keyword ) = split ' ';
push @{ $h{$animal} }, $keyword;
}
close $f;
KEYWORD:
for my $keyword (qw(Little Awkward Small Tiny)) {
for my $animal (keys %h) {
for my $k (@{$h{$animal}}) {
if($k eq $keyword) {
say "$keyword $animal";
next KEYWORD;
}
}
}
say "keyword $keyword not found";
}
关于Perl 创建散列引用并一次从每个分支循环一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907125/