打印两个循环内的变量

时间:2016-08-07 18:32:54

标签: perl

我无法弄清楚如何逃避这一点。

我想打印变量$rfam_column,它位于两个循环中。但是我不能在print出现的地方之后立即编写$rfam_column命令,因为我想打印出在循环之外的其他内容并将它们与打印内容结合起来。

我很感激任何关于我在这里做错的建议。

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列的表(我提取了几列,否则在一行中表示会很长):

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

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:1)

  

我想打印其他将在循环之外的内容并将它们组合到$ rfam_column内容

您可以在print中包含外部范围中的任何内容。您可以将print语句放在内部循环

顺便说一句,我不知道你的意思

# insert "|" between RFs

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

相同
$rfam_column =~ s/^/|/;

只是在字符串

的开头添加了一个管道|字符

什么是RF?