将 stdout 通过管道传输到 Perl 时,如何让它打印换行符?

When piping stdout into Perl, how to get it to print a newline character?

我刚刚发现将 stdout 管道输送到 Perl,令我惊讶的是您甚至可以这样做:

[user@folder] $ echo print 1/3 | perl
0.33333[user@folder] $

据我了解,您将打印命令放入 Perl,并使用 Perl 的代码进行浮点计算。请纠正我。但是,每次我这样做时,我都会得到一个没有换行符的答案。我到处搜索,但我无法对足够具体的术语进行关键字来创建答案。

这是 link 我正在谈论的内容,在海报 Thor 下: How do I use floating-point division in bash?

他给出了一个惊人的答案,但我无法评论或给用户发消息,所以我决定在这里创建一个新问题。

我仍在努力思考这是如何工作的, 变量也是如此。

$ three=3
$ echo $three/3 | perl
1[user@folder] $

奖金问题:
一开始我只是想让 bash 在算术运算中输出浮点数。我不明白为什么 bc 不能 return 浮动。据说可以,但它对我不起作用。

理想情况下:

$ echo 1/3 | bc
0
$

应该 return .333 而不是 0。我委托给一个工具,bcbc 应该能够做花车。我只是不明白这是怎么回事。

Perl

使用 -l 选项(参见 perldoc perlrun):

$ echo print 1/3 | perl -l
0.333333333333333
$

它会自动添加换行符。文档说:

-l[octnum]

enables automatic line-ending processing. It has two separate effects. First, it automatically chomps $/ (the input record separator) when used with -n or -p. Second, it assigns $\ (the output record separator) to have the value of octnum so that any print statements will have that separator added back on. If octnum is omitted, sets $\ to the current value of $/. For instance, to trim lines to 80 columns:

   perl -lpe 'substr($_, 80) = ""'

Note that the assignment $\ = $/ is done when the switch is processed, so the input record separator can be different than the output record separator if the -l switch is followed by a -0 switch:

   gnufind / -print0 | perl -ln0e 'print "found $_" if -p'

This sets $\ to newline and then sets $/ to the null character.


Shell

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纯属侥幸。这一次,它表示 'load the library',巧合的是将 scale 设置为 20,这就是显示 20 个小数位的原因。

顺便说一下,让 π 保留大量小数位的快速方法是:

$ echo '4*a(1)' | bc -l
3.14159265358979323844
$ echo 'scale=40; 4*a(1)' | bc -l
3.1415926535897932384626433832795028841968
$

通过-l 选项从库中加载的函数a 用于'arctan'。我观察到 Google 搜索 'pi 40 digits' 中至少有 3 个来源表明它应该是:3.1415926535 8979323846 2643383279 5028841971 — 这表明 bc 的第 40 位数字有 3 个错误.

使用 bashcalculator 即 bc 你应该这样做 :

echo " scale=4; 1 / 3" | bc

其中 scale 的值定义了浮点数的数量。