2014-02-27 85 views
0

任何人都可以幫忙嗎?我不明白我要去哪裏錯了 -Perl哈希和if-else條件語句

我想創建兩個散列,它包含來自輸​​入文件的相同值的不同鍵,以便選擇所有大於或等於等於2並將其打印到單獨的文件。

輸入文件,其中第1列是ID號,第2列是ID名稱,第3列是表達式值。 輸入文件(input.txt中):

ENSG00000251791 SCARNA6 2.5 
ENSG00000238862 SNORD19B 6.3 
ENSG00000238527 SNORD112 -3 

我想選擇的ID號和名稱具有大於或等於一個表達式2和打印這些出單獨的文件看起來像這樣:

ENSG00000251791 SCARNA6 2.5 
ENSG00000238862 SNORD19B 6.3 

我簡化了以前的腳本,絕對有效(謝謝M42),因爲我會有非常大的文件,需要節省空間。

下面的代碼:

use strict; 
use warnings; 

my $input = 'input.txt';     
open my $input_file_handle, '<', $input or die $!; 

while (<$input_file_handle>) { 
    chomp($_); 
    my @id = split(/\s+/); 
    my %id1; 
    my %id2; 

    my $id1{$id[0]} = $id[1]; 
    my $id2{$id[0]} = $id[2]; 
    foreach (keys%id1) { 
    print $_,"\t", $id1{$_}, "\t", $id2{$_}; 
    } 
} 

foreach (keys%id1) { 
    print "$_ "; 
    if ($id1{$_} >= 2) { 
    print "$id1{$_}"; 
    } else { 
    print "N/A"; 
    } 
} 

我不斷收到要求對@id和%ID的明確包名稱錯誤消息。我不知道我要去哪裏錯。如果任何人有任何建議或意見,解釋將是神話般的。

感謝 哈里特

回答

1

你所得到的「顯式包」警告的原因是,您聲明在錯誤的範圍內的變量:

while (<$input_file_handle>) { 
    ... 
    my @id ... 
} # end of block that @id is in -> end of scope 

    # @id is out of scope here 

所以,如果你希望你的錯誤走開,你聲明while循環之外的變量。但是,您嘗試的解決方案並不是很好。首先,你根本不需要存儲任何值,如果你想要做的就是檢查列3> = 2。其次,你不需要兩個哈希來存儲值,你只需要使用一個。第三,如果您只想重新打印原始行,則存儲split的值是沒有意義的。這是你真正需要的是功能:

while (<>) { 
    my ($num, $name, $val) = split; 
    if ($val >= 2) { 
     print; 
    } 
} 

這裏所有的值存儲在臨時變量,它走出去的範圍在每個循環迭代結束。

你會這樣稱呼它:

perl script.pl input.txt > output.txt 

它也是一個相當簡單的一行:

perl -ane 'if ($F[2] >= 2) { print }' input.txt > output.txt 
1
use strict; 
use warnings; 

my $input = 'input.txt';     
open my $input_file_handle, '<', $input or die $!; 

my %hash; 
while (<$input_file_handle>) { 
    chomp; 
    my ($k, @id) = split /\s+/; 
    $hash{$k} = \@id; 
} 

for my $k (sort keys %hash) { 
    my $id = $hash{$k}; 
    if ($id->[1] >=2) { 
    print "@$id\n"; 
    } 
} 
+0

有沒有做這件事的方式,以保持在兩列身份證號和姓名?我知道它過於複雜,但我需要兩個ID。除此之外,它非常棒! – user1879573

+0

我收到了更多錯誤消息:在test.pl第18行的 =)中使用了未初始化的值,<$ input_file_handle>第8行。我嘗試了my'ing @id,$ id並註釋掉命令但不輸出 – user1879573

+0

@ user1879573 https://eval.in/106316 –