从文本文件创建一个多维向量



我有以下问题:

我有一个文件看起来像:

1 2 4 5 7 8
3 1 3 7 8 9 10 11
2 4 1 3 5
4 5 6 7

我想创建不同的向量,其中:

vector[0][0]=1 , vector[0][1]=2, ... , vector[1][0]=3, vector[1][1]=1 etc etc

我还在开始,我试着:

my $file = 'file.dat';
open (INFO, $file);
my @vector = <INFO>;
close (INFO);

,但它只创建一个数组,读取文件中包含的内容,而不授予文件元素的确切位置(如我所期望的结果)。

遍历文件,拆分行并将它们放入一个匿名数组中,然后将其推入主数组:

use strict;
use warnings;
use Data::Dumper;
# Use the lines below for your real data
#my $file = 'file.dat';
#open my $fh, "<", $file or die "Cannot open $file: $!";
my @vector;
while (<DATA>) {   # replace <DATA> with <$fh>
    push @vector, [ split ];
}
print Dumper @vector;
__DATA__
1 2 4 5 7 8
3 1 3 7 8 9 10 11
2 4 1 3 5
4 5 6 7
输出:

$VAR1 = [
          [
            '1',
            '2',
            '4',
            '5',
            '7',
            '8'
          ],
          [
            '3',
            '1',
            '3',
            '7',
            '8',
            '9',
            '10',
            '11'
          ],
          [
            '2',
            '4',
            '1',
            '3',
            '5'
          ],
          [
            '4',
            '5',
            '6',
            '7'
          ]
        ];

您可以非常简单地使用map和正则表达式来挑选数字子字符串my @vector = map [ /d+/g ], <FILEHANDLE>

这个程序从DATA文件句柄中读取,以方便演示。您通常会使用open my $fh, '<', 'myfile' or die $!打开一个文件,并从该文件句柄中读取。

Data::Dump仅用于显示数据结构,其他方面没有必要。

use strict;
use warnings;
use 5.010;
my @vector = map [ /d+/g ], <DATA>;
use Data::Dump;
dd @vector;
say "$vector[0][0] = $vector[0][0]";
say "$vector[0][1] = $vector[0][1]";
say "$vector[1][0] = $vector[1][0]";
say "$vector[1][1] = $vector[1][1]";

__DATA__
1 2 4 5 7 8
3 1 3 7 8 9 10 11
2 4 1 3 5
4 5 6 7

[
  [1, 2, 4, 5, 7, 8],
  [3, 1, 3, 7 .. 11],
  [2, 4, 1, 3, 5],
  [4 .. 7],
]
$vector[0][0] = 1
$vector[0][1] = 2
$vector[1][0] = 3
$vector[1][1] = 1

相关内容

  • 没有找到相关文章

最新更新