Perl 我能得到一些调试这段代码的帮助吗?

Perl 我能得到一些调试这段代码的帮助吗?,perl,Perl,这是一个用于获取单词过去分词的子程序。传入动词,将其拆分为字符,然后根据最后的字母选择结尾: ##Past Participle sub getPPForBase(){ ##$verb passed in my $verb = shift; my @verbChars = split(//,$verb); ##Split into characters my $verbLen = @verbChars; ##Length of @verbchars

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

##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.
有人能帮我弄清楚这意味着什么,以及如何修复它吗?(代码运行正常,但恐怕有一个隐藏的问题)

如果你需要更多信息,请告诉我


非常感谢。

这意味着您将verbLen拼错为verLen

我的$verbLen

$verbChars[$verLen-2]


这些事情中的一件和另一件不一样…

正如其他人所指出的,你的打字错误导致了你的问题。如果您使用了以下选项,则不会出现问题:

use strict;
use warnings;
哪一个总是应该的。那就这么做吧

此外,这是您当前sub的替代方案:

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

在这种情况下,我认为使用正则表达式是一种更可取的解决方案,因为它更易于阅读。同样,如果这样说,在需要时添加或删除条件会更容易,而不是试图整理所有的if子句。

我认为您需要将其更改为
$verbLen-2
在这里
$verbChars[$verLen-2]eq“I”
这意味着人们应该始终
使用严格的;使用警告我明白了,我从别人那里得到了代码。。。从现在起,每当我得到一个新的代码,我都会把它们放在最上面,而不仅仅是信任它。谢谢这不仅仅是严格使用的问题;使用警告;在代码的顶部。在不理解代码的情况下这样做可能会导致它无法运行。然后,你会发现自己正在追查原作者未能申报的所有全局变量。在尝试在系统上运行代码之前,最好先阅读并理解代码。然后,如果在通读之后,您足够了解它,使其严格/符合警告,请继续进行修复。或者只是使用代码中的想法来设计自己编写良好的严格兼容版本。谢谢,真的缩短了代码!我猜s///返回true以及更改的标量?@Jon yes。或者更具体地说,返回替换的数量。From:“在字符串中搜索模式,如果找到,则用替换文本替换该模式,并返回所做替换的次数。否则返回false(特别是空字符串)。”