2013-03-02 88 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 
相關問題