如何使用二维数组使用Perl访问文件中的数据?

时间:2013-01-24 18:49:53

标签: perl perl-data-structures

我是Perl编码和新手的新手。我正面临着一种情况。这是问题陈述:

我有一个文件,其中包含一些矩阵形式的数据(仅限数字),如

1 2 3 4 5 6 .......
7 9 4 6 7 8 .......
...................
...................

我有另一个文件,其中包含2行数据(某些坐标),如

30 50
04 09
80 90
.. ..
.. ..

这些是位于第一个文件中的数据的坐标,我想从第一个文件中提取该数据。粘贴在第二个文件的第3行,例如在第一种情况下,我必须搜索第30行中的元素&第一个文件中的第50列&将其粘贴到第二个文件的第1行第3列。

1 个答案:

答案 0 :(得分:3)

这并不难。

首先,您必须解析值矩阵。如果输入位于文件句柄$fh中,那么您可以执行以下操作:

my @data;
while(<$fh>) {
  chomp;              # remove newline
  my @row = split;    # split the current line on whitespace
  push @data, \@row;  # put a reference to this row into @data.
}

数组只能包含标量,因此我们必须将该行的引用放入我们的数据矩阵中。

以上内容可以写成

my @data = map { chomp; [split] } <$fh>;

代替; [...]生成匿名ar​​rayref,map通过在块中应用操作来转换列表。

可以像$data[$y][$x]一样访问数据。如果你想交换索引,这在Perl中变得很难,但并非不可能。

要访问第二个文件坐标处的数据(我假设文件句柄为$fh2),我们只需拆分这些行并查找元素:

while (<$fh2>) {
  chomp;
  my ($x, $y) = split;
  say "at x=$x, y=$y there is $data[$y][$x]";
}

请务必在每个脚本的顶部use strict; use warnings;来捕获错误。 say需要perl 5.10或更高版本。