我可以帮助调试这段代码吗?

时间:2011-06-23 17:58:13

标签: perl

这是一个子程序,用于获取单词的过去分词。动词被传入,分成字符,然后根据最后的字母,选择结尾:

##Past Participle
sub getPPForBase(){ ##$verb passed in
        my $verb = shift;
        my @verbChars = split(//,$verb); ##Split into characters
        my $verbLen = @verbChars; ##Length of @verbchars, as a number
###PROBLEM HERE:: trying to say last letter is e, second last is i
        if(($verbChars[$verbLen -1] eq "e") && ($verbChars[$verLen -2] eq "i")){
                return substr($verb,0,$verbLen-2)."ying";
        }
    if($verbChars[$verbLen -1] eq "e"){
                return substr($verb,0,$verbLen-1)."ing";
    }
        return $verb."ing";
}

错误:

[Thu Jun 23 13:47:51 2011] [error] [client ::1] Use of uninitialized value $verLen in subtraction (-) at /Users/jon/Desktop/stanford-postagger-full-2011-04-20/verbTenseChanger.pl line 59.

有人可以帮我弄清楚这意味着什么,以及如何解决它? (代码运行正常,但我担心存在隐藏的问题。)

如果您需要更多信息,请与我们联系。

非常感谢。

3 个答案:

答案 0 :(得分:3)

正如其他人所指出的,你有一个错字导致你的问题。如果您使用过:

,这不会成为问题
use strict;
use warnings;

哪一个总应该。那样做。

此外,这是您当前子代码的替代选择:

sub getPPForBase {
    my $verb = shift;
    return $verb . "ying" if $verb =~ s/ie$//;
    return $verb . "ing"  if $verb =~ s/e$//;
    return $verb . "ing";
}

在这种情况下,使用正则表达式,我认为是一个更受欢迎的解决方案,因为它更容易阅读。此外,当这样放置时,在需要时更容易添加或删除条件,而不是尝试整理所有if子句。

答案 1 :(得分:2)

这意味着你拼写错误的verbLen为verLen。

答案 2 :(得分:2)

  

我的 $ verbLen

     

...

     

$ verbChars [ $ verLen -2]

其中一件事与其他事情不一样......