为什么Perl告诉我,当我已经声明它时,我的数组是未声明的?

时间:2016-11-28 11:46:57

标签: perl

我有一个如下所示的输入文件:

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'符号。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

您描述的错误不会由该代码生成。这是我能看到的问题清单

  • 您已声明@tabfile但正在使用@tab_file

  • 您的陈述if {$tabfile[3] < $tabfile [4]) {有一个左括号而不是左括号

  • 您的陈述print "$tabfile[0]\n" > $output应为

    print $OUTPUT "$tabfile[0]\n";
    
  • 同样的陈述缺少右括号

  • close需要文件句柄参数,而不是文件名,因此您的语句close $outputclose $tab_input应为close $OUTPUTclose $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";