2013-11-20 34 views
-1

創建文本文件,從多維數組TEMP.TXT有內容類似這樣的文件:在Perl

ABC 1234 56 PQR 
XYZ 8672 12 RQP 

如何將TEMP.TXT文件存儲到一個二維數組,這樣我就可以通過訪問它們數組索引?

+3

也許你會感興趣的模塊'領帶:: File'或'領帶::陣列:: CSV'。 – TLP

+1

此外,這個問題可以根據您的上下文有不同的最佳解決方案,所以您應該解釋爲什麼您需要一個二維數組,並顯示您打算使用它的代碼。 – TLP

+0

您想通過數組索引? – fugu

回答

1
use File::Slurp; 
use Data::Dumper; 

my @arr = map [split], read_file("temp.txt"); 
print Dumper \@arr; 

輸出

$VAR1 = [ 
     [ 
     'ABC', 
     '1234', 
     '56', 
     'PQR' 
     ], 
     [ 
     'XYZ', 
     '8672', 
     '12', 
     'RQP' 
     ] 
    ]; 
+0

我在這裏有點困惑。你能告訴我如何訪問[1] [3]中出現的元素。意味着它應該返回值「RQP」。 – prashkum

+0

@prashkum你可以'打印$ arr [1] [3]' –

+1

這就是我正在尋找的東西。以上幾行完全符合我的要求。謝謝你「mpapec」。 – prashkum

1

至少,你可以這樣做

my @file = load_file($filename); 

sub load_file { 
    my $filename = shift; 
    open my $fh, "<", $filename or die "load_file cannot open $filename: $!"; 
    my @file = map [ split ], <$fh>; 
    return @file; 
} 

這將讀取參數文件,拆分上空白的內容並把它一個數組引用(每行一個)內,然後返回與數組的數組裁判。在退出子程序時,文件句柄將被關閉。

在某些方面,這是一個有點笨重的解決方案。它將整個文件加載到內存中,在查找特定值時沒有特別快速的查找等。如果每行都有唯一鍵,則可以使用散列而不是數組來進行查找速度快:

my %file = map { my ($key, @vals) = split; $key => \@vals; } <$fh>; 

注意,鍵必須是唯一的,或者他們會互相覆蓋。

或者您可以使用Tie::File只查找你想要的值:

use Tie::File; 
tie my @file, 'Tie::File', $filename or die "Cannot tie file: $!"; 

my $line = [ split ' ', $file[0] ]; 

或者,如果你有你的文件的行特定的分隔符,以及與CSV格式相符的格式,可以使用Tie::File::CSV

use Tie::File::CSV; 
tie my @file, 'Tie::Array::CSV', $filename, sep_char => ' ' 
    or die "Cannot tie file: $!"; 

my $line = $file[0]; 

注意,使用該模塊可能是矯枉過正,如果你沒有一個嚴格的csv格式可能會導致問題。此外,Tie::File也有降低性能的聲譽。哪種解決方案最好取決於您的需求和偏好。