最近我遇到了这种过滤掉列表中每一秒值的方法:
perl -E 'say grep --$|, 1..10'
13579
它是如何运作的?
答案 0 :(得分:25)
$|
是一个特殊的Perl变量,只能包含值0和1。
对 true 非零值$|
的任何赋值,如
$| = 1;$| = 'foo';$| = "4asdf"; # 0 + "4asdf" is 4 $| = \@a;
会将$|
设置为1. false 零值的任何分配
$| = 0; $| = ""; $| = undef; $| = "erk"; # 0 + "erk" is 0
会将$|
设置为0。
将--$|
展开到$| = $| - 1
,现在您可以看到发生了什么。
如果$|
最初为1,则--$|
会将值更改为0。
如果$|
最初为0,则--$|
会尝试将值设置为-1,但实际上会将值设置为1.
答案 1 :(得分:6)
哈! $|
在“预先计算”时,在零(false,in perl)和one(true)之间翻转 - 它只能保存这些值。
因此,您的grep
标准会在每次传递时更改,变为true,false,true,false等,因此返回列表中的每个其他元素。
太聪明了一半。
答案 2 :(得分:3)
$|
只能为零或一。默认值为0
,因此通过在grep
- 第0个索引之前递减它,它将为1。
随后的减量实际上会将它从零“切换”到零到零等等。
答案 3 :(得分:3)
关键是这个用法只是一个讨厌的黑客
$|
(或其更易读的别名$OUTPUT_AUTOFLUSH
)是一个特殊变量,用于控制STDOUT
(或当前选定的文件句柄)的自动刷新。因此,它只接受true(1
)或false(0
)。