2011-06-23 53 views
0

這是用於獲取單詞的過去分詞的子例程。動詞傳入,分裂成字符,然後根據最終的信件,結束選擇:我可以幫助調試此代碼嗎?

##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. 

有人可以幫我找出這意味着什麼,以及如何解決它? (代碼運行良好,但恐怕存在隱藏的問題)。

讓我知道你是否需要更多信息。

非常感謝。

+0

我認爲你需要把它改成'$ verbLen -2'這裏'$ verbChars [$ verLen -2] eq「i」' –

回答

2

這意味着你拼錯verbLen verLen。

+7

這意味着你應該總是'使用strict;使用警告;' – friedo

+0

我明白了,我從其他人處獲得了代碼......從現在開始,只要我得到一個新的代碼,我就會把它們放在頂部,而不會只信任它。謝謝! – Jon

+1

這不僅僅是嚴格使用的問題,使用警告;在代碼的頂部。如果不理解代碼,可能會導致它無法運行。然後你會發現自己追逐原始作者未能聲明的所有全局變量。在嘗試在系統上運行代碼之前,最好先閱讀並理解代碼。然後,如果在閱讀之後,您已經足夠了解它,以使其嚴格/符合警告,請繼續並進行修復。或者只是使用代碼中的想法來製作自己寫得嚴格的嚴格版本。 – DavidO

2

my $verbLen

...

$verbChars[$verLen -2]

這些事情之一是不喜歡其他的...

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子句分開。

+0

謝謝,真的縮短了代碼!我猜s ///返回true以及改變的標量? – Jon

+1

@Jon Yep。或者更具體地說,返回替換的數量。從[perldoc perlop](http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators):「在字符串中搜索一個模式,如果找到,則用替換文本替換該模式,* *返回進行的替換次數,否則返回false(具體爲空字符串)**「 – TLP