【问题标题】:When piping stdout into Perl, how to get it to print a newline character?将标准输出管道传输到 Perl 时,如何让它打印换行符?
【发布时间】:2016-03-16 23:03:24
【问题描述】:

我刚刚发现了有关将标准输出通过管道传输到 Perl 中的方法,我很惊讶您甚至可以这样做:

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

据我了解,您将打印命令放入 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 应该能够进行浮动。我只是不明白发生了什么。

【问题讨论】:

  • 添加一个 \n 字符,例如:“echo print 1/3 \n”给我一些奇怪的错误,我没有资格破译
  • 理想情况下,bonus 问题应该是一个新问题
  • 我想节省空间并高效地不占用太多空间。这整个努力只是我试图找出更短的方法来打印计算的行而不必求助于:echo $number $number2 | awk '{print $1/$2}'
  • 空间太大了哈。大声笑;)
  • 如果您需要浮点数,那么您可能使用了错误的 shell。请考虑使用支持浮点的 Korn shell。

标签: bash perl terminal pipeline bc


【解决方案1】:

Perl

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

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

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

-l[octnum]

启用自动换行处理。它有两个不同的效果。首先,当与-n-p 一起使用时,它会自动选择$/(输入记录分隔符)。其次,它将$\(输出记录分隔符)分配为 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
$

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

【讨论】:

  • 谢谢。我只知道必须有一个像这样的简单开关。因此,通过扩展,有没有办法在将 stdnin 提供给 perl 时获得它?就像,如果我想做 perl (print 3/3) -l.是否可以调用 perl 并为其提供您自己的输入,而不是让它接受管道的标准输出?
  • 您在寻找perl -e 'print 1/3' -l吗?也可能与-n-p 一起使用。
  • 那么为什么我必须做-e?当我将先前管道的输出(如 echo print test)提供给它时​​,perl 是否只是固有地将其解释为 -e 命令?否则,perl ____ 会寻找文件?编辑:似乎 -e 开关“打开”命令行
  • 您有时需要消化perldoc perlrun。使用-e,Perl 接受以下参数作为要运行的“脚本”。或者,如果您提供脚本名称 (perl script.pl),那么这就是要运行的脚本。如果这些都不适用,Perl 从标准输入读取脚本。 print 1/3 代码此时开始吱吱作响;这有点太简单了。但原则适用; Perl 从-e 参数、文件参数或标准输入读取脚本。
  • 嗯,所以理论上,我可以通过单引号之间的 -e 参数汇集整个 perl 脚本,它会像某种 Python IDLE 一样编译和运行,但在bash 环境?
【解决方案2】:

使用 bashcalculator,即bc,您应该这样做:

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

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

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2012-07-31
    相关资源
    最近更新 更多