我收到错误消息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;
}
}
答案 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
块。