Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中为变量分配可变长度的行?_Perl_Hash - Fatal编程技术网

如何在perl中为变量分配可变长度的行?

如何在perl中为变量分配可变长度的行?,perl,hash,Perl,Hash,我有一个要读取的文件,每个位置的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, '<',

我有一个要读取的文件,每个位置的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;
}

打开我的$loclist,”这应该可以满足您的需要

#!/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;

另外一个可能的选择是散列。当你想查找一个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
                    }
        };

您需要了解数组和arrayrefs之间的区别。你所需要做的就是
$locs{$loclist\u loc}=\@loclist\u rec
将对数组的引用放入哈希值中。每个人都会使用。你所需要的是这个。当您有数组数组或哈希数组时,引用是非常好的。或者任何不适合Perl最初的三种变量类型的复杂结构。阅读本教程,一切都会变得清晰。非常感谢,也感谢本教程!这正是我需要的:)
$VAR1 = {
          'loc2' => {
                      'id2' => 1
                    },
          'loc1' => {
                      'id1' => 1,
                      'id5' => 1,
                      'id4' => 1,
                      'id9' => 1
                    },
          'loc3' => {
                      'id1' => 1,
                      'id11' => 1,
                      'id23' => 1
                    }
        };