如何在Perl中将可变长度的行分配给变量?

3
我有一个文件需要读取,每个位置的id数量是不确定的,格式如下:
loc1    id1    id4    id5   id9
loc2    id2 
loc3    id1    id11   id23

我希望将其存储为locs(loc) = {属于该位置的所有id},这样以后,当我读取另一个文件时,可以像下面这样操作:

if (grep id, locs(loc)){do something}

我尝试使用哈希来实现这个,但是没有起作用。我尝试了:

open my $loclist, '<', $ARGV[0];
my %locs;
while (<$loclist>) {
my @loclist_rec = split;
my $loclist_loc = @rlist_rec[0];
$locs{$loclist_loc} = @loclist_rec;
}

但是这并没有起作用。 我对Perl还很陌生,仍在努力理解不同的数据类型。

有什么想法吗?非常感谢!


1
你需要学习数组和数组引用之间的区别。你所需要做的就是 $locs{$loclist_loc} = \@loclist_rec; 将一个指向数组的 引用 存入哈希值中。 - Jim Garrison
每个人都在使用参考文献给你答案。你需要的是Perl参考教程。当你有数组的数组或哈希的数组的哈希等复杂结构时,引用非常有用。或者任何不能完全适应Perl原始三种变量类型的复杂结构。阅读教程,一切都会变得清晰明了。 - David W.
非常感谢,还有教程!这正是我所需要的 :) - madieke
2个回答

6
这应该能满足你的需求。
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

open my $loclist, '<', "test.txt" or die $!;
my %locs;

while (<$loclist>) {
    my ($loclist_loc, @loclist_rec) = split;
    $locs{$loclist_loc} = \@loclist_rec;
}

print Dumper \%locs;

输出:

$ perl test.pl
$VAR1 = {
          'loc2' => [
                      'id2'
                    ],
          'loc1' => [
                      'id1',
                      'id4',
                      'id5',
                      'id9'
                    ],
          'loc3' => [
                      'id1',
                      'id11',
                      'id23'
                    ]
        };

0

另一个可能的选择是哈希嵌套哈希。当你想要查找一个 id 时,你可以这样说:if ($locs{$loc}{$id}) {do something}。数据结构将会是

$VAR1 = {
          'loc2' => {
                      'id2' => 1
                    },
          'loc1' => {
                      'id1' => 1,
                      'id5' => 1,
                      'id4' => 1,
                      'id9' => 1
                    },
          'loc3' => {
                      'id1' => 1,
                      'id11' => 1,
                      'id23' => 1
                    }
        };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接