2011-07-22 43 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。