我有以下问题:
我有一个看起来像的文件:
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);
但它只创建一个数组来读取文件中包含的内容,并且不会赋予文件元素一个确切的位置(因为我期望的结果)。
答案 0 :(得分:4)
迭代文件,拆分行并将它们放入一个你推入主阵列的匿名数组中:
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'
]
];
答案 1 :(得分:2)
您可以非常简单地使用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