2016-08-07 2 views
0

어떻게 이것을 벗어날 수 있는지 알 수 없었습니다.두 개의 루프 안에있는 변수를 인쇄하십시오.

두 개의 루프 안에있는 변수 $rfam_column을 인쇄하고 싶습니다. 하지만 $rfam_column이 나타나는 곳 바로 뒤에 print 명령을 쓸 수는 없습니다. 루프 외부에있는 다른 내용을 인쇄하여 인쇄 된 내용과 결합하기를 원하기 때문입니다.

여기에서 내가 잘못하고있는 것에 대한 조언을 주시면 감사하겠습니다.

use warnings; 
use strict; 

my $in; 
GetOptions('input' => \$in) or die; 

if ($in) { 

    my $input = $ARGV[0] or die; 

    open (my $fh, '<', $input) or die "Can't open $input $!\n"; 
    chomp (my @db_file = <$fh>); 
    close $fh; 

    my @list = grep /RNA/, @db_file; 

    my $column; 
    my @column =(); 

    foreach $column (@list) { 

     my @all_columns = split (/\t/, $column); 
     my $rfam_column = $all_columns[0]; 

     # insert "|" between RFs 

     foreach $_ ($rfam_column) { 
      s/^/|/; 
     } 
    } 
} 

print "$rfam_column"; 
Global symbol "$rfam_column" requires explicit package name at script_vbeta.pl line 90. 
Execution of script_vbeta.pl aborted due to compilation errors. 

모든 코드와 입력 된 정보를 포함하도록 편집 - 제안 출력 :

입력 파일이 같은 N 라인 VS N 열 테이블 (I이고 그렇지 않으면 한 줄로 표현하는 것이 훨씬 길어질 것입니다.) :

RF00001 1302 5S ribosomal RNA 
RF00006 1307 Vault RNA 
RF00007 1308 U12 minor spliceosomal RNA 
RF00008 1309 Hammerhead ribozyme (type III) 

출력은 다음과 같아야합니다. 이 :

|RF00001|RF00006|RF00007 

그리고 코드 (사용 : script.pl -i INPUT_FILE) :

use warnings; 
use strict; 
use Getopt::Long; 
Getopt::Long::Configure("pass_through"); 


my $in; 
GetOptions('input' => \$in) or die; 

if ($in) { 

    my $input = $ARGV[0] or die; 

    open (my $fh, '<', $input) or die "Can't open $input $!\n"; 
    chomp (my @db_file = <$fh>); 
    close $fh; 

    my @list = grep /RNA/, @db_file; 

    my $column; 
    my @column =(); 

    foreach $column (@list) { 

     my @all_columns = split (/\t/, $column); 
     my $rfam_column = $all_columns[0]; 
     # insert "|" between RFs 
     foreach $_ ($rfam_column) { 
      s/^/|/; 
     } 
    } 
} 
print "$rfam_column"; 
+0

쇼 샘플 입력 (복수 RNA 라인) 파일 어떤 출력 당신이 당신의 실제 프로그램을 제시해주십시오 – ysth

+0

을하고자하는 원하는 생각합니다. 당신이'Undefined subroutine & main :: GetOptions'로 죽었다는 것을 보여주었습니다. – Borodin

+0

프로그램을 더 읽기 쉽게 만들면 많은 도움이 될 것입니다. ysth와 나는 우리가 직접 읽을 수 있도록 여기까지했다. – Borodin

답변

1

내가 루프 밖에서해야하며 그들을 결합 할 다른 일을 인쇄하고 싶습니다 $ rfam_column 내용

당신은 print외부 범위에 아무것도 포함 할 수 있습니다. 당신은 그냥 그런데 내부 루프

내부에 print 문을 넣을 수 있습니다, 난 그냥 추가

$rfam_column =~ s/^/|/; 

과 동일 당신이

# insert "|" between RFs 

foreach $_ ($rfam_column) { 
    s/^/|/; 
} 

무슨 뜻인지 모르겠어요 파이프의 끝 부분에 문자

RF 란 무엇입니까?

+0

안녕하세요, Borodin, RF는 RF0001과 같습니다. 대체 함수에 대한 foreach 루프를 변경했습니다. 감사합니다 – Leonardo

2

난 당신이

if ($in) { 
    ... 

    my @rfams; 
    for my $row (@list) { 
     my @fields = split(/\t/, $row); 
     my $rfam = $fields[0]; 
     push @rfams, $rfam; 
    } 

    my $rfams = join('|', @rfams); 
    print("$rfams\n"); 
} 
+0

정확히 내가 원했던 것! 그것은 효과가 있었다. 고맙습니다. – Leonardo

관련 문제