--$| 怎么样?在 Perl 中工作?
最近我遇到了这种方法来过滤列表中的每一个第二值:
perl -E 'say grep --$|, 1..10'
13579
它是如何工作的?
Recently I came across this way to filter out every second value of a list:
perl -E 'say grep --$|, 1..10'
13579
How does it work?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
$|
是一个特殊的 Perl 变量,只能具有值 0 和 1。任何对
true非零值的$|
的赋值,都会产生将
$|
设置为 1 的效果。false零值会将
$|
设置为 0。将
--$|
展开为$| = $| - 1
,现在你可以看到发生了什么。如果
$|
最初为 1,则--$|
会将值更改为 0。如果
$|
最初为 0,则--$|
将尝试将该值设置为 -1,但实际上会将该值设置为 1。$|
is a special Perl variable that can only have the values 0 and 1.Any assignment to
$|
of atruenon-zero value, likewill have the effect of setting
$|
to 1. Any assignment of afalsezero valuewill set
$|
to 0.Expand
--$|
to$| = $| - 1
, and now you can see what is going on.If
$|
was originally 1, then--$|
will change the value to 0.If
$|
was originally 0, then--$|
will try to set the value to -1 but will actually set the value to 1.哈!当“预先递减”时,
$|
在零值(在 Perl 中为 false)和一值(true)之间翻转——它只能保存这些值。因此,您的 grep 标准在每次传递时都会发生变化,变为 true、false、true、false 等,从而返回列表中的所有其他元素。
太聪明了一半。
Ha!
$|
flips between the values of zero (false, in perl) and one (true) when "predecremented" -- it can only hold those values.So, your
grep
criterion changes on each pass, going true, false, true, false, etc., and so returning every other element of the list.Too clever by half.
$|
只能是零或一。默认值为0
,因此通过在grep
-ing 第 0 个索引之前递减它,它将是 1。随后的减量实际上会将其从零“切换”到一再到零,依此类推。
$|
can only be zero or one. The default is0
, so by decrementing it beforegrep
-ing the 0th index, it'll be one.The subsequent decrements will actually "toggle" it from zero to one to zero and so forth.
关键是这种使用只是一种令人讨厌的黑客行为。
$|
(或其更具可读性的别名$OUTPUT_AUTOFLUSH
)是一个特殊变量,用于控制STDOUT
(或当前选定的文件句柄)的自动刷新。因此它只接受 true (1
) 或 false (0
)。The point is this use is just a nasty hack.
$|
( or his more readable alias$OUTPUT_AUTOFLUSH
) is a special variables to control the autoflush ofSTDOUT
( or the current selected filehandle). Therefore it only accepts true (1
) or false (0
).