我有一个如下所示的输入文件:
AC_000044.1_a_bothflanks_2kb_polyA.4 AAGTATAATAAAAAAAAAAAAGAAA 25 25 69646
AC_000044.1_aa_bothflanks_2kb_polyA.5 AAGTATAATAAAAAAAAATAATTAAAAAAAAAAAAAATAAAAAATAAAATAAAATAAAAATAAAAA 66 91 69644
AC_000044.1_ab_bothflanks_2kb_polyA.5 TATAATAAAAAAAAAAACATTAAAAATAAAAAATAAAAAATAAAAA 46 137 69647
AC_000044.1_ac_bothflanks_2kb_polyA.3 TATAATTAAAAAAAAAAAAAAAAAAAA 27 164 69642
由标签分隔的5条信息。我想取第5个标签中的每个数字,并将其与第4个标签中的每个数字进行比较,如果它小于或等于我希望它在第一个标签中返回数据的那个数字。
这是我的代码:
#! /usr/bin/perl -w
use strict;
use Cwd;
my $tab_input = $ARGV[0];
my $output = 'output.txt';
my (@trans_id, @seq, @length, @cum_length, @coord);
open (my $INPUT, "<$tab_input") or die "unable to open $tab_input\n";
open (my $OUTPUT, ">$output") or die "unable to open $output\n";
while (<$INPUT>) {
my @tabfile =split ("\t+",$_);
push @trans_id, $tabfile[0];
push @seq, $tab_file[1];
push @length, $tab_file[2];
push @cum_length, $tab_file[3];
push @coord, $tab_file[4];
for (@tabfile) {
if {$tabfile[3] < $tabfile [4]) {
print "$tabfile[0]\n" > $output;
}
}
close $output;
close $tab_input;
print "Tab file parsing complete.\n";
但是,我在第22行(if语句)收到错误,说$ coord和%cum_length需要显式的包名。我已经在代码顶部对数组进行了描述。当我只使用数组时,为什么它会在错误代码中返回%'hash'符号。有什么想法吗?
答案 0 :(得分:7)
您描述的错误不会由该代码生成。这是我能看到的问题清单
您已声明@tabfile
但正在使用@tab_file
您的陈述if {$tabfile[3] < $tabfile [4]) {
有一个左括号而不是左括号
您的陈述print "$tabfile[0]\n" > $output
应为
print $OUTPUT "$tabfile[0]\n";
同样的陈述缺少右括号
close
需要文件句柄参数,而不是文件名,因此您的语句close $output
和close $tab_input
应为close $OUTPUT
和close $INPUT
分别。
我认为它看起来应该更像
#!/usr/bin/perl
use strict;
use warnings 'all';
open my $out_fh, '>', 'output.txt' or die $!;
while ( <> ) {
my @fields = split;
print $out_fh "$fields[0]\n" if $fields[3] < $fields [4];
}
print "Tab file parsing complete.\n";