2013-06-26 45 views
0

我有一個包含多行和多列數據的文件。我需要讀取文件並在特定列匹配特定數字時打印。引用數組中的列perl

這是我下面,我目前沒有得到任何結果:

my $old_flag = 'file1.txt'; 
my $new_flag = 'file2.txt'; 

open (IN, "<$old_flag"); 
open (OUT, "+>$new_flag"); 

my @data = <IN>; 

for (@data) { 
    my @old_flag; 
    chomp; 
    @old_flag = split /\t/, $_; 
    push (@records, @old_flag); 
} 

foreach my $record (@records) { 
    if($record[2] == 11125) { 
     print OUT "$record[2]\n"; 
    } else { 
     next; 
    } 
} 
+1

加'use strict;使用警告;'給你的腳本。 – TLP

回答

4

你可能認爲你正在做這個

push (@records, @old_flag); 

但實際上創建二維數組你只是將值推到一個常規數組中。在這裏,你以爲你是訪問一個二維數組

foreach my $record(@records){ 
    if($record[2] == 11125) { 

但實際上,你只是檢查同樣不存在的數組元素每次循環。您看到$record$record[2]指的是兩個不同的變量。後者只是@record陣列的第三個元素。你從來沒有宣佈過。如果您用過use strict你會得到錯誤:

Global symbol "@record" requires explicit package name at foo.pl line 12 

你可以做些什麼來解決這個問題是:

push @records, \@old_flag; # works because @old_flag is a lexical variable 
... 
foreach my $record (@records) { 
    if($record->[2] == 11125) { 

在這裏,你對待$record作爲數組引用,它是。

由於你沒有使用

use strict; 
use warnings; 

這兩個編譯指示有一定的學習曲線有這些問題,但是他們會阻止你進行簡單的錯誤和拼寫錯誤,並會降低你的調試時間。

+0

感謝@TLP的領導。我不能相信我忘記了那些。當我嘗試打印$記錄時,仍然遇到問題。我得到諸如ARRAY(0xd23570)之類的東西。任何想法在這裏仍然是錯誤的? – user2320229

+1

這是一個數組參考字符串化。如果要打印其值,則必須對其進行取消引用。例如。 'print @ $ record' – TLP

+0

啊我明白了。再次感謝TLP現在都在努力! – user2320229