我有以下问题:
我有一个文件看起来像:
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