2012-12-28 63 views
0

我有一个运行一个Perl代码的问题。它给我这个消息: “无法调用方法”说'没有包或对象引用'不能调用方法'说'

事情是,我找到了这个代码,我想用它来检查我的结果序列对齐。但它不会运行。

use strict; 
use warnings; 

use List::Util 'min'; 
use Memoize; 

chomp(my $str1 = <"atattga">); 
chomp(my $str2 = <"gagassa">); 

my ($distance, $aligned1, $aligned2) = align($str1, $str2); 
say $distance; 
say $aligned1; 
say $aligned2; 

sub align { 
    my ($str1, $str2) = @_; 

    return (length($str2), ('-' x length($str2)), $str2) if !length($str1); 
    return (length($str1), $str1, ('-' x length($str1))) if !length($str2); 

    my @delete = align(substr($str1, 1), $str2); 
    $delete[0]++; 
    $delete[1] = substr($str1, 0, 1) . $delete[1]; 
    $delete[2] = '-' . $delete[2]; 

    my @insert = align($str1, substr($str2, 1)); 
    $insert[0]++; 
    $insert[1] = '-' . $insert[1]; 
    $insert[2] = substr($str2, 0, 1) . $insert[2]; 

    my @substitute = align(substr($str1, 1), substr($str2, 1)); 
    $substitute[0]++ if substr($str1, 0, 1) ne substr($str2, 0, 1); 
    $substitute[1] = substr($str1, 0, 1) . $substitute[1]; 
    $substitute[2] = substr($str2, 0, 1) . $substitute[2]; 

    if ($delete[0] <= $insert[0] && $delete[0] <= $substitute[0]) { 
     return @delete; 
    } 
    elsif ($insert[0] <= $delete[0] && $insert[0] <= $substitute[0]) { 
     return @insert; 
    } 
    else { 
     return @substitute; 
    } 
} 
BEGIN { memoize('align') }; 
+0

你也可以'使用功能qw(说);'也是。 – squiguy

回答

6

就在你的脚本的开头加入这一行

use 5.010; 
+0

它工作:)我只是用了另一个版本:)谢谢 – ttwis

+0

@ttwis:不客气。 – Toto

0

错误消息是因为你还没有包括其中包含“说”关键字的定义包。默认情况下,Perl仅包含'main'包,除非其他人明确使用'use'关键字指定。

使用5.010;

这将解决问题:)