Perl对任何以数字开头的字符串进行数值计算(在警告它不是数字之后)是真的吗?
我试图了解各种比较操作符是如何工作的。我编写了一个脚本来输出各种真或假结果,如下所示。(我的问题是在之后提出的。)
(在我的帖子中,我把花括号浓缩成单行,以节省空间,或许可以让人更容易阅读。)
这是我向StackOverflow提出的第一个问题,如果我能改进我的问题是如何被问到的,或者问到哪里,请告诉我。)
#!/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,尽管它们显然不相等(以及一些错误的结果):
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"完全相同。
发布于 2020-06-27 00:12:27
Perl有点奇怪,因为是运算符强迫数据,而不是数据决定操作符做什么。因为Perl有一个标量而不是更具体的数据类型,所以它会根据您正在做的事情来判断您是否需要字符串或数字。如果使用数字运算符,Perl将尝试将操作数转换为数字。
它通过忽略前导空格来实现这一点,它们将十进制数字取到字符串的末尾或第一个非十进制数字的末尾。它还将接受第一个小数点和它后面的小数位数。我们在学习Perl中对此进行了介绍,但您也可以在百列数中阅读到。
因此,字符串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代码的计算结果是您得到的结果。
https://stackoverflow.com/questions/62604460
复制相似问题