6

我的程序中有以下代码:

$val = chr(someFunction());

if($val == " ")
{
    #do something

}
elsif($val == 0)
{
   #do something else
}

但是,只要将 0 传递给 $val,if 部分就会执行,而不是我希望执行的 elsif。

我怎样才能解决这个问题?

谢谢你。

4

3 回答 3

23

运算符用于比较==数值。如果要比较字符串,则应使用eq运算符。

if ($val eq " ") ...
于 2009-04-07T10:35:53.820 回答
5

有几种方法可以解决这个问题(TIMTOWDI)。looks_like_a_number您可以从标准Scalar::Util包中导入函数:

if (looks_like_a_number($val) and $val == 0) {
    #do something
}

您可以使用字符串相等运算符

if ($val eq 0) {
    #do something
}

如果你有 Perl 5.10,你可以使用智能匹配运算符

if ($val ~~ 0) {
    #do something
}

还有很多。您使用哪种方法在很大程度上取决于您要达到的目标。

于 2009-04-07T11:03:45.923 回答
3

如果您启用了警告,您就会知道问题所在。

运行这个:

use strict;
use warnings;

my $val = chr(someFunction());

if($val == " ")
{
    #do something

}
elsif($val == 0)
{
   #do something else
}

sub someFunction {
    return 1;
}

你得到: C:>test.pl 参数“”在 C:\test.pl 第 6 行的数字 eq (==) 中不是数字。参数“^A”在数字 eq (==) 中不是数字在 C:\test.pl 第 6 行。

添加使用诊断为我们提供了额外的解释:

   (W numeric) The indicated string was fed as an argument to an operator
   that expected a numeric value instead.  If you're fortunate the message
   will identify which operator was so unfortunate.

所以,既然我们不想要数字 eq,我们想要字符串 eq: eq。如果您还不知道这一点,您可以查看perldoc perlop有关Equality Operators的信息。

这是一个典型的例子,说明使用warningsand strictpragma 如何节省时间。

于 2009-04-07T18:00:20.897 回答