怎么做 - $ |在Perl工作?

时间:2011-02-10 15:44:15

标签: perl variables built-in

最近我遇到了这种过滤掉列表中每一秒值的方法:

perl -E 'say grep --$|, 1..10'
13579

它是如何运作的?

4 个答案:

答案 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)。