String “关于操作员”;x";在Perl中

String “关于操作员”;x";在Perl中,string,perl,String,Perl,我对以下代码输出感到困惑: print "1234567890" x (10+9)/10; 输出是 1.23456789012346e+188. 我知道为了达到预期的效果,代码应该是这样的: "1234567890" x ((10+9)/10) 但为什么前一个代码生成的是浮点数而不是字符串?运算符“x”在Perl中不是字符串运算符吗?x是字符串运算符,但您正在使用它生成的字符串,它将“12345678950123456789012345678901234567890123456789012

我对以下代码输出感到困惑:

print "1234567890" x (10+9)/10;
输出是

1.23456789012346e+188.
我知道为了达到预期的效果,代码应该是这样的:

"1234567890" x ((10+9)/10)

但为什么前一个代码生成的是浮点数而不是字符串?运算符“x”在Perl中不是字符串运算符吗?

x是字符串运算符,但您正在使用它生成的字符串,它将“1234567895012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890”并将其除以10。

x是一个字符串运算符,但您在它生成的字符串上使用/,它将“12345678901234567134567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567918901234567890123456789012345679189012345678901234567890123456789012345678901234567890”然后除以10。

似乎
1234467890
是concat'd 19次,然后除以10创建一个float。

似乎
1234467890
是concat'd 19次,然后除以10创建一个float。

好吧,让我们看看perl如何使用该模块处理该表达式:

很明显,它把它当作一个数字来评估。也许是因为分裂?让我们试着把它拿出来

$ perl -MO=Deparse,-p -e 'print "1234567890" x (10+9);'
print('1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');
看起来差不多对。所以,基本上,它会打印出那个数字,因为由于除法的作用,你把那个很长的字符串当作一个数字


请注意,
x
/
具有相同的优先级,并且是左关联的,因此
a x b/c
被视为
(a x b)/c

好吧,让我们看看perl如何使用模块来处理该表达式:

很明显,它把它当作一个数字来评估。也许是因为分裂?让我们试着把它拿出来

$ perl -MO=Deparse,-p -e 'print "1234567890" x (10+9);'
print('1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');
看起来差不多对。所以,基本上,它会打印出那个数字,因为由于除法的作用,你把那个很长的字符串当作一个数字

请注意,
x
/
具有相同的优先级,并且是左关联的,因此
a x b/c
被视为
(a x b)/c

x
/
具有相同的优先级。所以

print "1234567890" x (10+9)/10;
相当于

print(  ("1234567890" x (10+9)) / 10  );
请注意,
x
不仅仅是字符串重复运算符。它可以生成列表:
(1)x3
(1,1,1)

x
/
具有相同的优先级。所以

print "1234567890" x (10+9)/10;
相当于

print(  ("1234567890" x (10+9)) / 10  );
请注意,
x
不仅仅是字符串重复运算符。它可以生成列表:
(1)x3
(1,1,1)