2014-02-25 1 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 번호가 포함 해시를 만든 내가 생각

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"; 
} 

: 여기

ENSG00000251791 SCARNA6 2.5 
ENSG00000238862 SNORD19B 6.3 

를 코드입니다 나는 ID 번호와 이름을 선택하는 정규 표현식을 작성하여 과도하게 복잡하게 만들었으므로 더 간단하고 효율적인 방법이 있다면 위대 할 것입니다.

+0

있습니다 어떤 캡처 그룹은 ... – fugu

+0

죄송합니다, 나는 당신이 제발 설명 할 수있는, 펄 매우 새로 온 사람? – 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 : Nothing !!! OP의 코드를 복사/붙여 넣기했습니다. :-( – Toto