-5

编辑:我之前确实尝试过使用 eq 而不是 == ,但它没有用。出于某种原因,现在确实如此。有可能当时还有另一个错误导致它无法工作,但现在这个问题已经解决了。谢谢你。

我正在尝试做一些简单的验证。我想确保通过变量提供的重定向 url 是否以特定站点开头。如果是,则重定向通过,如果不是,则重定向到站点的根目录。看起来很简单,对吧?

$redir = $input{'redirect'};
$redir_sub = substr($redir, 0, 21);
if ($redir_sub == "http://www.mysite.com") {
     print "Location: $redir \n\n";
}else{
     print "Location: http://www.mysite.com \n\n";
}

问题是,无论我在其中放置什么变量,“if”都会返回为真。我可以把我最喜欢的网络漫画放在那里,它会重定向到它,尽管字符串不匹配。例如这个:

$redir = $input{'redirect'};
$redir_sub = "http://www.yahoo.com"
if ($redir_sub == "http://www.mysite.com") {
     print "Location: $redir_sub \n\n";
}else{
     print "Location: http://www.mysite.com \n\n";
}

重定向到雅虎!到底是怎么回事?

4

5 回答 5

2

你的问题是你没有使用

use warnings;

这就是 Perl 允许你犯这个错误的原因。您正在使用数字相等运算符来比较字符串。因此,Perl 首先尝试将每个参数转换为数字。而且由于您的字符串不是以数字开头(并且看起来不像数字),因此它们将转换为 zero 0。因此你的表达

if ($redir_sub == "http://www.mysite.com")

真的是这个意思

if (0 == 0)

这当然总是返回 true。

如果您一直在使用警告,则会收到以下错误:

Argument "http..." isn't numeric in numeric eq (==) at ...
Argument "http..." isn't numeric in numeric eq (==) at ...

这将暗示您应该使用eq而不是==比较字符串的问题。

于 2013-06-10T17:32:35.273 回答
2

运算符==用于比较数字。您应该将其替换为操作员eq

于 2013-06-10T17:25:55.177 回答
2
if ($redir_sub == "http://www.mysite.com")

应该

if ($redir_sub eq "http://www.mysite.com")

eq字符串相等运算符一样,并且使用==强制数字比较,所以在这种情况下,条件总是评估为真,因为0 == 0它是真的。

于 2013-06-10T17:26:03.403 回答
2

TL;DR:eq不要使用==


Perl 作为一门语言似乎有一个问题:它对许多不同的事物使用相同的数据类型(标量),包括字符串和数字。标量同时是两者,而不仅仅是其中之一。Perl 没有类型注释,也没有办法指出一个变量是保存一个字符串还是一个数字。

当我们考虑相等性测试时,这会产生问题。假设两个标量$a = "42.0"$b = 42。他们平等吗?是和否:

  • "42""42.0"不是一回事!这些相等。
  • 数字4242.0相等!

如上所述,Perl 没有使用类型系统来解决这种歧义。相反,它使用不同的运算符集进行字符串和数字运算:

eq ne lt le gt ge cmp
== != <  <= >  >= <=> 
于 2013-06-10T17:27:04.440 回答
1

==进行数值比较。 eq进行字符串比较。当您使用字符串作为数字时,perl 将您的字符串传递给您的 c 库的 aton()。因此,您实际上是在询问计算机 0 == 0 是否为真。

于 2013-06-10T17:28:10.723 回答