不能在 perl 中使用未定义的值作为符号引用

Can't use an undefined value as a symbol reference in perl

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

我无法根据 other to this 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 文件的第一个字符是“>”,我想在 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;
    }

}

当写入的文件句柄未定义时,print 会产生该错误。

例如:

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

将产生同样的错误。没有看到你在做什么来定义 $sequences 我不能告诉你为什么 - 但你是否检查了 open 中的 return 代码?

假设$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 期间未定义

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

use Data::Dumper;
print Dumper $sequences; 

在您的错误行之前试试这个,看看是否能给您带来任何有趣的东西。

编辑:(进一步编辑):

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

这就是导致您出现问题的原因 - my$sequences 定义为 在该块 中 - 它会立即 undef您退出 unless 块。