【问题标题】:How can a string with alpha chars in it be numerically equivalent to a number in Perl?包含 alpha 字符的字符串如何在数字上等同于 Perl 中的数字?
【发布时间】: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


【解决方案1】:

Perl 有点奇怪,因为是操作符强制数据,而不是数据决定操作符做什么。由于 Perl 有一个标量而不是更具体的数据类型,它会根据您正在做的事情确定您是否需要字符串或数字。如果使用数字运算符,Perl 会尝试将操作数转换为数字。

它通过忽略前导空格来做到这一点,它们将十进制数字带到字符串的末尾或第一个非十进制数字。它还将接受第一个小数点及其后面的小数位。我们在 Learning Perl 中对此进行了介绍,但您也可以在 perlnumber 中阅读。

所以,字符串4 - 1 在数字上是4,带有警告:

$ perl -wle " print q(4 - 1) + 0 "
Argument "4 - 1" isn't numeric in addition (+) at -e line 1.
4

我想你问的是一个稍微不同的问题。 Perl 不会为你做数学。你有一个eval,它将把字符串作为 Perl 代码执行。 Perl 代码的计算结果就是你得到的结果。

【讨论】:

  • 那么当 Perl 试图将字符串转换为数值时,它将获取所有的数字,直到它变成一个非数字字符,这将是它的数值?好的,这有助于解决问题,谢谢!