我编写了一个代码来获取网站的网址,然后搜索字符串,然后将该字符串(实际上是数字)与硬编码的数字进行比较
#!/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");
}
为什么要改变价值?因为它无法下载文件。
答案 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
以下是相等运算符的文档 -
答案 2 :(得分:2)
这是因为您在此“测试”中将分配给$version
值!$oldVersion
:
if($version =! $oldVersion )
并且$oldVersion
没什么 - 但$oldversion
是37.您正在为$version
分配 undefined 变量的布尔否定。 Undefined是布尔值false,因此否定是布尔值true或1.
如果您非常了解perl,那么您必然会遇到使用strict
和warnings
的建议。如果你这样做了,它会告诉你,除其他外:
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";
}