2016-08-07 5 views
0

これをエスケープする方法はわかりませんでした。2つのループの内側にある変数を出力します。

私は変数$rfam_columnを印刷したいと思います。これは2つのループの内側にあります。しかし、$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行対n列を有するテーブル(Iありますそれ以外の場合は、1行で表現するのにはかなり時間がかかります)。

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

をしたいと思いますし、どのような出力、あなたの本当のプログラムをご提示ください – 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

私はあなたが(複数のRNAラインを有する)ショーのサンプル入力ファイル

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

関連する問題