Perl 创建散列引用并一次从每个分支循环一个元素

标签 perl loops hash for-loop hash-reference

作为初学者,我遇到了一个我认为相当复杂的问题,希望有人能提供帮助。

我有以下文本文件(制表符分隔)...

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/

相关文章:

c++ - 仅当程序处于焦点时退出循环的关键监听器(c++)

javascript - 如何遍历oData中的每个对象?

c - 匹配(搜索)C 列表中的 URL 的最佳方法(实现白名单或黑名单)?

string - 如何检查环境变量是否已设置?

node.js - 当循环中调用异步函数时,Node.JS 将如何处理循环控制?

perl - 使用 Perl 解析文本文件的最有效方法是什么?

ruby - 减少数组时使用 Hash.new 作为初始值

relational-database - 对用户名和密码进行散列会产生任何安全优势吗?

xml - 如何使用 XPath 和 Perl 检索属性

perl - Perl 5.10+ 中词法 $_ 的优缺点