不能在 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
块。
我收到一条错误消息 Can't use an undefined value as a symbol reference
。
我无法根据 other
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
块。