【发布时间】:2013-06-04 16:24:13
【问题描述】:
我有一些文件,我正试图解析并从第三个文件构建哈希和查找。文件格式:
文件 1:
ID2
ID4
文件 2:
x1 y1 z1 ID1
x2 y2 z2 ID2
x3 y3 z3 ID2
x4 y4 z4 ID4
文件 3:
a1 b1
a2 b2
a3 b3
我正在尝试做的事情:
对于 File1 中的所有这些 ID,使用 File2 中的 ID 字段查找 x 和 y 坐标,并查看 File3 中的“a”是否位于 x 和 y 之间。
到目前为止我的想法:
- 获取文件 2;将其解析为以 ID 为键的哈希
- 获取文件 1;如果 ID 存在于文件 2 中;打开文件 3 并检查“a”的坐标范围 并打印出来
我执行了多远? 不太远。我正在尝试读取文件 2 并解析哈希中的所有元素,但我被卡住了:
while (<FILE>){
chomp $_;
my $line = $_;
my @arr = split ("\t", $line);
my $id = $arr[3];
if (exists ($hash{$id})) {
my $x = $arr[0];
my $y = $arr[1];
my $z = $arr[2];
push @{$hash{$id}{'x'}, $x;
push @{$hash{$id}{'y'}, $y;
push @{$hash{$id}{'y'}, $y;
} else {
$hash{'id'} = $id;
$hash{$id}{'x'} = $arr[0];
$hash{$id}{'y'} = $arr[1];
$hash{$id}{'z'} = $arr[2];
}
}
print Dumper %hash;
close FILE;
当然,我在这里做错了
【问题讨论】:
-
我用我的小眼睛窥探 (1) 语法错误
@{$hash{$id}{'y'}← 取消引用在哪里停止? (2) 一个y和$y,其中应该有z/$z(3) 在else中,您将$hash{id}定义为一个字符串,然后将其用作包含标量。但是在if中,您将它们视为arrayrefs 的hashrefs(我猜)。也许您应该向我们展示预期的数据结构。 -
抱歉,这只是最初的想法。当涉及到数组的哈希时,我并不熟悉,所以请原谅语法错误。预期的数据结构应如下所示,其中考虑了同一 ID 的 x 、 y 和 z 的多个值。 $VAR58477 = 'ID2'; $VAR58478 = { 'x' => [ 'x2','x3, ], 'y' => [ 'y2','y3' ], 'z' => [ 'z2','z3' ] };