将 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。我委托给一个工具,bc
,bc
应该能够做花车。我只是不明白这是怎么回事。
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 的值定义了浮点数的数量。
我刚刚发现将 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。我委托给一个工具,bc
,bc
应该能够做花车。我只是不明白这是怎么回事。
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 的值定义了浮点数的数量。