在这个使用Perl的特定示例中,“无法定位对象方法..”是什么意思?

我正在使用特定的 BioPerl 包,使用 Perl 对我的数据进行一些分析。

我在另一篇文章中阅读了有关此问题的一些建议,但我真的不明白这如何适用于我的脚本。

这是我的脚本:

use strict;
use warnings;
use Bio::AlignIO;
use Bio::Align::DNAStatistics;

my $file = $ARGV[0];
my $idfile = $ARGV[1];

if ($file eq "" ) {
  $file = "NT_MSA_S_protein.fasta";
} elsif ($idfile eq "" ) {
  $idfile = "NT_ID_S_protein.csv";
}

my @contentIDS;

open (LIST, $idfile) or die;
while (my $l = <LIST>) {
    $l =~ s/n//g; # delete newline
    $l =~ s/r//g; # delete CR
    next if (length($l) < 1);
    push @contentIDS, $l;
}
close LIST;

my $stats = Bio::Align::DNAStatistics->new();
my $alignin = Bio::AlignIO->new(-format => 'fasta', -file   => $file);  # MSA file
while (my $aln = $alignin->next_aln) {
    my $matrix = $stats->distance(-align => $aln, -method => 'Tajima-Nei');
    WL1: 
    foreach my $aaa (@contentIDS) { ### ID #1
        WL2:
        foreach my $baa (@contentIDS) { ### ID #2
            next (WL2) if ($aaa eq $baa);
            my $data =  $matrix->get_entry($aaa, $baa);
            print "DISTANCEt$aaat$baat$datan";
        } # END WL2
    } # END WL1
}

这是消息错误:

Can't locate object method "get_entry" via package "0" (perhaps you forgot to load "0"?) at Tajima-Nei_Distance_NV.pl lin$

我认为问题可能与“=> 相反 ->”有关。我只是假设。

回答

它告诉您 $matrix 的值为 0。Perl 将 0 解释为类名。您对 $matrix 的分配有问题。

my $matrix = $stats->distance(-align => $aln, -method => 'Tajima-Nei');
my $matrix = $stats->distance(-align => $aln, -method => 'Tajima-Nei');

我想你想要-method => 'TajimaNei'。检查 $stats->available_distance_methods。


通常你不能有一个名为 0 的类,但是有足够的推力猪飞得很好。

*{"0::hello"} = sub { "Hellon" };

package main;

my $matrix = 0;
print $matrix->hello;


回答

您收到的消息无法定位对象方法...(来自perldiag),意味着

(F) 你在一个不存在的类上调用了一个方法,并且在 UNIVERSAL 中找不到该方法。这通常意味着一个方法需要一个尚未加载的包。

所以调用的对象有问题。要么这样的类不存在,如上面引用的文档所说,要么调用该方法的对象不好(早些时候失败了)......让我们通过代码和文档跟踪该调用。

该链从Bio::Align::DNAStatistics::distance方法开始,该方法返回类Bio::Matrix::PhylipDist 的对象。语法是正确的,所以我们期望一个好的矩阵对象(或者如果细节错误,则希望出现彻底的错误)。

但是,错误消息的一部分说

...通过包“0”...

显然意味着矩阵对象实际上有问题(它0- 根本不是一个对象),所以对于应该返回该对象的调用,

根据文档中进一步列出的距离方法之一D_TajimaNei 判断,您可能需要说-method => 'TajimaNei'(没有连字符)。人们可能希望该方法croak出现这样的错误,因为我认为返回 a 没有意义0,但由于情况并非如此,因此在使用此类时添加额外检查可能是个好主意。

另请注意,方法get_entry只能在没有参数的情况下调用,get_entry()并且尝试的get_entry($aaa, $baa)方法(需要两个参数)不存在。这会引起脚注† 中提到的另一个相关错误。


请注意,此方法条目中的括号注释perldiag指定错误出在对象本身上,而 中的前一个条目perldiag,除了该括号注释之外,语法完全相同,当方法出现问题时引发叫做。我建议始终检查违规声明的所有部分。

根据发布时的最新文档


以上是在这个使用Perl的特定示例中,“无法定位对象方法..”是什么意思?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>