不能在perl

时间:2015-05-07 13:56:42

标签: perl reference

我收到错误消息Can't use an undefined value as a symbol reference

根据other answers question,我无法弄清楚我做错了什么:

use strict;
use warnings;

print "Enter sequences to print (six1 = 0 eya1 = 1 six1-eya1 = 2): ";
chomp($seqs_to_print = <STDIN>);

程序中稍后会抛出错误的行:

print $sequences ">$xlocs $gene $condition \n$eya_seqs{$xlocs}\n" if $seqs_to_print == 1;

我打开$sequences文件句柄,如下所示:

unless ($flag1 eq '-s'){
open my $sequences, '>', '/Users/Desktop/sequences.txt' or die $!;
}

所以范围界定不是问题。

如果我使用

,我也不会收到任何错误
print $sequences ">$xlocs $gene $condition \n$eya_seqs{$xlocs}\n";

注意:我可以在我的问题中看到可能令人困惑的内容:FASTA文件的第一个字符是'&gt;',我希望在其中添加xlocs。这不是read in

以下是引发错误的行周围的代码:

unless ($flag1 eq '-s'){

    sub sequence {
        my (%seqs, $xloc);
        my ($xlocs, $c, $e, $ch, $gene, $count, $condition) = @_;
        $gene =~ s/^ //g;
        print $sequences ">$xlocs $gene $condition \n$six_seqs{$xlocs}\n" if $seqs_to_print == 0;
        print $sequences ">$xlocs $gene $condition \n$eya_seqs{$xlocs}\n" if $seqs_to_print == 1;
        print $sequences ">$xlocs $gene $condition \n$sixeya1_seqs{$xlocs}\n" if $seqs_to_print == 2;
    }

}

1 个答案:

答案 0 :(得分:4)

print当文件处理它的文件未定义时,会生成该错误。

E.g:

my $test = undef;
print $test "some text";

会产生同样的错误。如果没有看到您要定义$sequences的内容,我无法告诉您原因 - 但您是否检查了open的返回代码?

假设$sequences当然是文件句柄。如果它不是,那么你可能只想在那里粘上一个逗号。

print $sequences, ">$xlocs $gene $condition \n$eya_seqs{$xlocs}\n" if $seqs_to_print == 1;

您使用的是引用的代码:

sub open_save{
    open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
}

因为这会产生完全相同的结果 - 您将打开$fh并且它会立即超出范围并变为未定义(并关闭)。哪个会有这个结果。但是use strict;use warnings会告诉您$sequences是否超出范围。

编辑:

根据您的代码更新 - 我害怕方式,我可以引出您正在看到的错误消息,$sequence未定义。

但是,你 在另一个代码块中创建了一个sub - 这有点不寻常,我想象的不是你真正想要的。

我能得到类似东西的唯一方法 - 使用一些虚拟数据 - 是:

use strict;
use warnings;

my $sequences;
my %six_seqs;
my %eya_seqs;
my %sixeya1_seqs;
my $flag1 = "-not_s"; 
my $seqs_to_print = 1;

unless ($flag1 eq '-s'){

    sub sequence {
        my (%seqs, $xloc);
        my ($xlocs, $c, $e, $ch, $gene, $count, $condition) = @_;
        $gene =~ s/^ //g;
        print $sequences ">$xlocs $gene $condition \n$six_seqs{$xlocs}\n" if $seqs_to_print == 0;
        print $sequences ">$xlocs $gene $condition \n$eya_seqs{$xlocs}\n" if $seqs_to_print == 1;
        print $sequences ">$xlocs $gene $condition \n$sixeya1_seqs{$xlocs}\n" if $seqs_to_print == 2;
    }

}

sub some_other_code {
    open ( my $sequences, ">", "sequence_file" ) or warn $!;
    sequence ( 1,2,3,4,5,6 );
    close ( $sequences );
}

some_other_code();

这会产生相同的错误,因为在序列$sequences期间sub未定义

此问题的解决方案涉及通过子例程传递文件句柄 - 但您也可以&#34;查看&#34;发生了什么:

use Data::Dumper;
print Dumper $sequences; 

在您的错误行之前尝试这一点,看看是否能给您带来任何有趣的信息。

编辑:(进一步编辑):

unless ($flag1 eq '-s'){
    open my $sequences, '>', '/Users/Desktop/sequences.txt' or die $!;
}

导致您出现问题的原因是my$sequences定义为中的 - 并且只要您undef退出unless块。