我的程序中有以下代码:
$val = chr(someFunction());
if($val == " ")
{
#do something
}
elsif($val == 0)
{
#do something else
}
但是每当0传递给$ val时,if部分执行而不是我期望执行的elsif。
我该如何解决这个问题?
谢谢。
答案 0 :(得分:23)
==
运算符用于比较数值。如果要比较字符串,则应使用eq
运算符。
if ($val eq " ") ...
答案 1 :(得分: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
}
还有更多。您使用哪种方法在很大程度上取决于您要实现的目标。
答案 2 :(得分: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”在C:\ test.pl第6行的数字eq(==)中不是数字。
添加使用诊断程序为我们提供了另外的解释:
(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。
这是使用warnings
和strict
pragma如何节省时间的典型示例。