2013-03-02 60 views
1

我有以下问题:创建从一个文本文件中的多维矢量

我有一个看起来像一个文件:

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); 

但它只创建一个读取文件中包含的内容的数组,并且不会赋予文件元素的确切位置(因为我期待的结果)。

回答

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' 
      ] 
     ]; 
+0

很抱歉,但我怎么能打开数据文件吗?如果文件名为'file.dat',我怎么能在脚本中说出去找到这个文件中的数据? – 2013-03-02 16:49:40

+0

您已经在代码中打开了该文件。你没有意识到这一点?因为它看起来像你。尽管您应该使用三参数打开和词法文件句柄。并检查您的公开声明的返回值。 – TLP 2013-03-02 16:51:56

+0

非常感谢,它的作品 – 2013-03-02 17:02:21

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 
相关问题