我无法弄清楚如何逃避这一点。
我想打印变量$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";
答案 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?