perl代码表现得很奇怪

时间:2011-07-22 10:30:37

标签: string 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 个答案:

答案 0 :(得分:4)

你的意思是!=,而不是=!,这是一个否定的分配。

此外,split总是使用正则表达式(除了具有单个空格的字符串的特殊情况),因此.中的5.3.0.个匹配任何非换行符。您可能希望\ - 逃避它们。

您可能对debian devtools包中的uscan脚本感兴趣。

答案 1 :(得分:3)

你的“非等于”操作员倒退了。它应该是!=而不是=!

通过使用=!,您实际上是在说“将$ version设置为$ oldversion的否定值”。

这是违规行

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

另请注意,通过使用!=运算符,您告诉perl $ version和$ oldversion包含数字。对于字符串比较,您应该使用ne运算符,该运算符假定这些变量包含字符串。

if($version ne $oldVersion )  # String inequality

以下是相等运算符的文档 -

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

答案 2 :(得分:2)

这是因为您在此“测试”中分配给$version!$oldVersion

if($version =! $oldVersion )

并且$oldVersion没什么 - 但$oldversion是37.您正在为$version分配 undefined 变量的布尔否定。 Undefined是布尔值false,因此否定是布尔值true或1.

如果您非常了解perl,那么您必然会遇到使用strictwarnings的建议。如果你这样做了,它会告诉你,除其他外:

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

这意味着您未在此程序包中声明$oldVersion为词法(my)或程序包级别(our),因此如果您要使用它,请包括你得到它的包裹。在绝大多数情况下,经验丰富的Perl程序员会认为这是“呃,我没有声明$oldVersion!”原因是你宣布$ old v ersion。

答案 3 :(得分: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";
}