2014-02-25 40 views
-1

任何人都可以提供幫助,我的Perl腳本有問題。我想將3列數據輸入文件推入數組,選擇ID號和名稱,使用ID作爲鍵和值作爲值聲明散列,然後運行if-else條件語句以選擇鍵 - 值對大於2.將數據推入數組的問題,在Perl中聲明哈希和條件語句

下面是input.txt數據文件的示例,其中column 1 is ID number, column 2 is ID name and column 3 value associated with columns 1 and 2

ENSG00000251791 SCARNA6 2.5 
    ENSG00000238862 SNORD19B 6.3 
    ENSG00000238527 SN-112 -3 
    ENSG00000222373 RNY.5P5 1.3 

我可以得到的第一部分數據推入到一個數組,但我不能其餘的工作。我已經創建了一個包含ID號兩個散列:值和ID名稱:值對,因爲我想在輸出文件中兩列:

ENSG00000251791 SCARNA6 2.5 
ENSG00000238862 SNORD19B 6.3 

下面的代碼:

use strict; 
use warnings; 
my $input = 'input.txt'; 

my @input_vars; 
open my $input_file_handle, '<', $input or die $!; 

while (<$input_file_handle>) { 
    chomp $_; 
    push @input_vars, $_; 
} 
close $input_file_handle; 
# regex to select ID name, ID number and value 
my %id; 
foreach (@input_vars) { 
    my $regex = '/\w+\s[\w-]+\s\d+\.\d+/'; 
    while ($_ =~ m/$regex/g) { 

      my $id1{$1} = $3; 
      my $id2{$2} = $3; 
    } 
} 
foreach (@input_vars) { 
    print "$_ "; 
    if ($id1{$_} >= 2) { 
      print "$id1{$_}"; 
} else { 
      print "N/A"; 
} 
    if ($id2{$_} >= 2) { 
    print "$id2{$_}"; 
} else { 
    print "N/A"; 

print "n"; 
} 

我想我通過創建一個正則表達式來選擇ID號和名稱,從而使它過於複雜,所以如果有一種更簡單,更有效的方法,那將會很棒。

+0

,我們在您的正則表達式沒有捕捉組... – fugu

+0

對不起,我很新的Perl中,你能解釋一下嗎? – user1879573

+0

哪裏有'$ gene_exp1 {$ _}'和'$ gene_exp2 {$ _}'來自哪裏? – Toto

回答

0

更改第一foreach循環:

foreach (@input_vars) { 
    if (/(\w+)\s([\w-]+)\s(\d+\.\d+)$/) { 
     $id1{$1} = $3; 
     $id2{$2} = $3; 
    } 
} 
+1

什麼是'my'在那裏? tobyink

+1

@tobyink:沒什麼!我只是複製/粘貼OP的代碼。 :-( – Toto