Eug*_*ash 20 variables perl built-in
最近我遇到这种方式来过滤掉列表的每一个值:
perl -E 'say grep --$|, 1..10'
13579
Run Code Online (Sandbox Code Playgroud)
它是如何工作的?
mob*_*mob 25
$|
是一个特殊的Perl变量,只能有值0和1.任何赋值$|
都是真正的非零值,比如
$| = 1;$| = 'foo';$| = "4asdf"; # 0 + "4asdf" is 4 $| = \@a;
将具有设置$|
为1 的效果.任何假零值的赋值
$| = 0; $| = ""; $| = undef; $| = "erk"; # 0 + "erk" is 0
将设置$|
为0.
展开--$|
到$| = $| - 1
,现在您可以看到发生了什么.如果$|
原来是1,那么--$|
将值更改为0.如果$|
原来是0,那么--$|
将尝试将值设置为-1但实际上将值设置为1.
哈! $|
当"预先递减"时,在零(false,in perl)和one(true)之间翻转 - 它只能保存这些值.
因此,您的grep
标准会在每次传递时更改,变为true,false,true,false等,因此返回列表中的每个其他元素.
太聪明了一半.