将stdout传递给Perl时,如何让它打印换行符?

时间:2015-12-11 05:24:25

标签: bash perl terminal pipeline bc

我刚刚发现将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.我委托给一个工具,bcbc应该能够做浮动。我只是不明白发生了什么。

2 个答案:

答案 0 :(得分:6)

的Perl

使用-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
$

BC

您的红利问题:

$ 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的值定义了浮点数的数量。