关于哈希:如何将可变长度的行分配给perl中的变量?

how to assign lines of variable length to a variable in perl?

我有一个要读取的文件,其中每个位置的 id 数量可变,如下所示:

1
2
3
loc1    id1    id4    id5   id9
loc2    id2
loc3    id1    id11   id23

我想将其存储如下 locs(loc) = {所有属于该位置的 id}
这样以后,当我读取另一个文件时,我可以执行类似

的操作

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

我尝试使用哈希来执行此操作,但这不起作用。我试过了:

1
2
3
4
5
6
7
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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;

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ perl test.pl
$VAR1 = {
          'loc2' => [
                      'id2'
                    ],
          'loc1' => [
                      'id1',
                      'id4',
                      'id5',
                      'id9'
                    ],
          'loc3' => [
                      'id1',
                      'id11',
                      'id23'
                    ]
        };

还有一个可能的选择是散列的散列。当你想查找一个 id 时,你可以说 if ($locs{$loc}{$id}) {do something}。数据结构将是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$VAR1 = {
          'loc2' => {
                      'id2' => 1
                    },
          'loc1' => {
                      'id1' => 1,
                      'id5' => 1,
                      'id4' => 1,
                      'id9' => 1
                    },
          'loc3' => {
                      'id1' => 1,
                      'id11' => 1,
                      'id23' => 1
                    }
        };