2011-07-22 107 views
1

我已經寫了代碼來獲得一個網站的網址,然後搜索字符串,然後該字符串(實際是序號)的硬編碼數比較Perl代碼舉止怪異

#!/usr/bin/perl 

use LWP::Simple; 

my $oldversion =36; 


$pageURL="http://www.google.com/isos/preFCS5.3/LATESTGOODCVP/"; 
my $simplePage=get($pageURL); 


my $newPage = "$simplePage"; 
my $str = (split("href=\"CVP-LATEST-5.3.0.",$newPage))[1]; 

my $version = substr("$str",0,2); 

print $version;    // HERE IT PRINT 37 WHICH IS CORRECT 


if($version =! $oldVersion) 
{ 


print $version;    // BUT HERE IT PRINTS 1 WHICH IS WRONG. HOW IS IT CHANGING ? 

##-- fetch the zip and save it as perlhowto.zip 
my $status = getstore("http://www.google.com/isos/preFCS5.3/LATESTGOODCVP/CVP-LATEST-5.3.0.$version.iso", "CVP-LATEST-5.3.0.$version.iso"); 
} 
else 
{ 
print("Currently new version\n"); 
} 

爲什麼改變價值 ?它無法下載該文件,因爲這一點。

+4

這是從你的實際代碼剪切和粘貼?一個變量似乎將名稱從$ oldversion更改爲$ oldVersion。而你似乎使用了錯誤的評論類型。爲什麼你不使用「嚴格使用」和「使用警告」?如果您可能不太願意發佈實際編譯的代碼,那麼它會更容易。 –

+1

加上'use strict;使用警告;'到腳本的頂部,修復錯誤和警告,然後發佈新代碼。 – TLP

+0

[總是。使用。嚴格。和。總是。使用。警告。](http://joelslinux.blogspot.com/2011/06/use-strict-and-warnings.html) –

回答

3

你已經讓你的「不等於」操作符倒退了。它應該是!=而不是=!

通過使用=!,您實際上是在說「將$ version設置爲$ oldversion的否定值」。

這裏是有問題的行

if($version =! $oldVersion) # Should be if($version != $oldVersion) 

還要注意使用!=操作符,你告訴的Perl $版本和$ oldversion包含數字。對於字符串比較,您應該使用ne運算符,該運算符假定這些變量包含字符串。

if($version ne $oldVersion) # String inequality 

這裏是平等的運營商的文檔 - 你的意思是!=,不=!,這是一個否定的分配

http://perldoc.perl.org/perlop.html#Equality-Operators

+0

嗨,我想比較這裏的數字。無論如何,我可以將字符串轉換爲數字嗎? – mac

+0

@mac您不必在perl中轉換數據類型,如果可能的話,它會自動完成。 'if($ str == $ text)'會自動嘗試將'$ str'和'$ text'轉換爲數字。如果無法完成,如果您打開了警告,perl會警告**。如果你關閉了警告 - 就像你有警告 - 它不會警告,併成爲一個很難找到的錯誤。 – TLP

4

此外,拆分總是使用正則表達式(除了具有單個空格的字符串的特殊情況外),因此5.3.0.中的那些.將匹配任何非換行符。你可能想要\ - 逃脫他們。

您可能會對debian devtools軟件包中的uscan腳本感興趣。

+0

好吧,我改變了它,但它仍然無法比較,如果兩個數字相等,它仍然在下載文件,而不是從IF循環中出來。 – mac

0

您對分割的使用在這裏沒有多大意義。你真正想要的是CVP-LATEST-5.3.0.字符串後面的兩個數字。通過添加引號($newPage = "$simplePage"),將一個變量分配給另一個變量也無濟於事。

而且,當然,正如其他人指出的,比較是!=而不是=!

我想改寫這個爲:

use strict; 
use warnings; 
use LWP::Simple; 

my $oldVersion = 36; 
my $url  = 'http://www.google.com/isos/preFCS5.3/LATESTGOODCVP/'; 

my $newPage = get($url) 
    or die "Cannot retrieve contents from $url\n"; 

if ($newPage =~ /href=\"CVP-LATEST-5\.3\.0\.(\d\d)/) { 
    my $version = $1; 

    if ($version != $oldVersion) { 
     my $status = getstore($url . "CVP-LATEST-5.3.0.$version.iso", 
           "CVP-LATEST-5.3.0.$version.iso"); 
    } else { 
     print "Already at most recent version\n"; 
    } 

} else { 
    die "Cannot find version tag in contents from $url\n"; 
} 
2

這是因爲你是在這個 「測試」 分配$version!$oldVersion

if($version =! $oldVersion) 

而且$oldVersion是什麼 - 但$oldversion是37.您正在分配$version變量的未定義的布爾否定。未定義爲布爾值false,因此否定爲布爾值true或1.

如果您在perl上閱讀的非常多,則一定會遇到使用strictwarnings的建議。假如你這樣做,它會告訴你的,除其他事項外:

Global symbol "$oldVersion" requires explicit package name at - line 21. 

這意味着你沒有宣佈$oldVersion詞法(my),或在此包中封裝級(our),因此,如果您想要使用它,請包括你得到它的包。在絕大多數情況下,一位經驗豐富的Perl程序員會認爲這是「呃,我沒有聲明$oldVersion!」原因是您宣佈$ old v ersion。