我刚刚发现将stdout传输到Perl中,我很惊讶你甚至可以这样做:
[user@folder] $ echo print 1/3 | perl
0.33333[user@folder] $
据我所知,您将print命令放入Perl,并使用Perl代码进行浮点计算。请指正。但是,每次我这样做,我都会得到一个没有换行符的答案。我在任何地方都进行了搜索,我只是无法将这些条款与特定条款相关联,以便创建答案。
这里是我所谈论的内容的链接,在海报Thor下: How do I use floating-point division in bash?
他给出了一个惊人的答案,但我无法对用户发表评论或发消息,所以我决定在这里创建一个新问题。
我仍然试图了解这是如何运作的, 变量也是如此。
$ three=3
$ echo $three/3 | perl
1[user@folder] $
奖金问题:
它起初就是我试图让bash在算术运算中输出浮点数。我不明白bc
无法返回浮动的原因。据说它可以,但它不适合我。
理想情况下:
$ echo 1/3 | bc
0
$
应该返回.333而不是0.我委托给一个工具,bc
和bc
应该能够做浮动。我只是不明白发生了什么。
答案 0 :(得分:6)
使用-l
选项(请参阅perldoc perlrun
):
$ echo print 1/3 | perl -l
0.333333333333333
$
自动添加换行符。文档说:
-l[octnum]
启用自动行结束处理。它有两个独立的效果。首先,当与
$/
或-n
一起使用时,它会自动选择-p
(输入记录分隔符)。其次,它将$\
(输出记录分隔符)指定为具有octnum的值,以便任何print语句都将重新添加该分隔符。如果省略octnum,则将$\
设置为当前值$/
。例如,要将线条修剪为80列:perl -lpe 'substr($_, 80) = ""'
请注意,在处理开关时会完成赋值
$\ = $/
,因此如果-l
开关后跟-0
,则输入记录分隔符可能与输出记录分隔符不同切换:gnufind / -print0 | perl -ln0e 'print "found $_" if -p'
这会将
$\
设置为换行符,然后将$/
设置为空字符。
shell扩展了shell变量,因此不应该出乎意料:
$ three=3
$ echo print $three/3 | perl -l
1
$ echo print $three/3
print 3/3
$
您的红利问题:
$ echo 1/3 | bc -l
.33333333333333333333
$
纯粹的侥幸,选项再次为-l
。这一次,它意味着“加载库”,巧合地将scale
设置为20,这就是显示20个十进制数字的原因。
顺便说一句,快速获取π到大量小数位的方法是:
$ echo '4*a(1)' | bc -l
3.14159265358979323844
$ echo 'scale=40; 4*a(1)' | bc -l
3.1415926535897932384626433832795028841968
$
由a
选项从库加载的函数-l
用于'arctan'。我观察到,谷歌搜索“pi 40位数”中至少有3个来源表明它应该是:3.1415926535 8979323846 2643383279 5028841971 - 这表明bc
的第40位有3个计数错误。
答案 1 :(得分:1)
使用bashcalculator即$handle = file_get_contents('php://input');
$body = json_decode($handle, true);
,你应该这样做:
bc
其中scale的值定义了浮点数的数量。