【发布时间】:2025-12-01 21:10:01
【问题描述】:
Perl 是否真的会对任何以数字开头的字符串进行数值计算,因为它在数值上等同于该数字(在警告它不是数字之后)?
我试图了解各种比较运算符的工作原理。
我编写了一个脚本来输出各种 TRUE 或 FALSE 结果如下。 (我的问题是后来提出的。)
(对于我的帖子,我将花括号压缩为单行,以节省空间并可能使其更易于阅读。
这是我对 * 的第一个问题,所以如果我可以改进我的问题被提出的方式,或者在哪里提出问题,请告诉我。)
#!/usr/bin/perl -w
#compOpers-mathyIn_TF.pl
use strict;
print "Enter expression to compare.\n";
chomp ( my $var = <STDIN> );
if ( $var == 0 ) { print "$var == 0 is TRUE.\n"; }
else { print "$var == 0 is FALSE.\n"; }
if ( $var == 1 ) { print "$var == 1 is TRUE.\n"; }
else { print "$var == 1 is FALSE.\n"; }
if ( $var eq "0" ) { print "$var eq \"0\" is TRUE.\n"; }
else { print "$var eq \"0\" is FALSE.\n"; }
if ( $var eq "1" ) { print "$var eq \"1\" is TRUE.\n"; }
else { print "$var eq \"1\" is FALSE.\n"; }
我尝试了一些数学表达式,例如"4 - 3"(和"4-3"),但没有成功。示例输出:
~\Perlscripts>perl compOpers_mathyInput_TF.pl
Enter expression to compare.
4 - 3
Argument "4 - 3" isn't numeric in numeric eq (==) at compOpers_mathyInput_TF.pl line 8, <STDIN> line 1.
4 - 3 == 0 is FALSE.
4 - 3 == 1 is FALSE.
4 - 3 eq "0" is FALSE.
4 - 3 eq "1" is FALSE.
~\Perlscripts>
经过一些研究,我意识到 Perl 默认不会对 STDIN 进行数学解析;
一旦我按如下方式向代码中添加了一个 eval 函数(为每个 if 块完成),它的效果会更好。
if ( eval($var) == 0 ) { print "eval($var) == 0 is TRUE\.\n"; }
else { print "eval($var) == 0 is FALSE\.\n"; }
但在达到这一点之前,我的原始代码已经收到了一些令人费解的结果。
起初我以为下面的结果在数学上解析了我输入的"1 x 1",但实际上似乎并非如此。
~\Perlscripts>perl compOpers_mathyInput_TF.pl
Enter expression to compare.
1 x 1
Argument "1 x 1" isn't numeric in numeric eq (==) at compOpers_mathyInput_TF.pl line 8, <STDIN> line 1.
1 x 1 == 0 is FALSE.
1 x 1 == 1 is TRUE. <<<-----
1 x 1 eq "0" is FALSE.
1 x 1 eq "1" is FALSE.
~\Perlscripts>
以下是 Perl 将脚本中的第二个真值测试 ( == 1 ) 测试评估为 TRUE 的其他类似结果,即使它们显然不相等(还有几个 FALSE 结果):
1 x 1 == 1 is TRUE.<br>
1/235 == 1 is TRUE.<br>
1x2 == 1 is TRUE.<br>
2x1 == 1 is FALSE.<br>
1andsometimes7 == 1 is TRUE.<br>
7isnt1 == 1 is FALSE.<br>
问题 1)
据我所见,Perl 对任何以数字开头的字符串进行数值计算,在数值上等同于该数字(在警告它不是数字之后)。
这是真的?这是个问题吗?为什么会这样?
(我也试过设置第二个真值测试来匹配一个不同于“1”的数字(我用的是8),结果是一样的。)
我还有一个后续问题,这个结果让我有些惊讶。一旦我将脚本更改为使用 eval,数值比较就会按预期工作。但是字符串比较在这里也出现了:
~\Perlscripts>perl compOpers_eval-mathyInput_TF.pl
Enter first expression to compare.
4-3
eval(4-3) == 0 is FALSE.
eval(4-3) == 1 is TRUE.
eval(4-3) eq "0" is FALSE.
eval(4-3) eq "1" is TRUE. <<<-----
~\Perlscripts>
**问题2**
(主要是要求确认) `"4-3"` 显然与字符串 `"1"` 中的字符不同。
`eval()` 解析我的输入,对其进行数学评估,然后将结果基本上放入一个字符串 `"1"` 中,这与比较字符串 `" 完全相同的字符,我是否正确1"`?
【问题讨论】:
-
我很抱歉这篇文章有多长......
-
我建议尽你所能,让它在不久的将来;它可能会被更少的人阅读。 (我很欣赏一篇经过深思熟虑且引人入胜的帖子,但通常无法阅读所有这些内容。)
-
pragma
use warnings;实际上比开关-w更好用(但很好的是你启用了警告!)。可以在perlrun找到讨论 -
@zdim 感谢您的反馈以及链接。我假设您主要指的是使用警告是词法范围的事实,并且还允许对警告进行更精细的控制。 (虽然我很惊讶地发现在链接的讨论中 she-bang 行上的 [有时] 限制为 32 个字符。)不久后,我计划深入研究警告和 pragma,但现在我可能会好吧,有很多警告,因为我不知道很多。 :-]
标签: perl comparison operators numeric