怎么做 - $ | 在Perl工作?

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.

  • @DVK - 其他未编排但很方便的代码高尔夫技巧:`$%`和`$ =`只能取整数值(当需要整数除法时很好),`$ -`只能取*非负*整数值和`$?`只能采用0到65535范围内的整数. (5认同)
  • @DVK我见过关于perlmonks的讨论.他们得出结论,只有"记录"的地方才是perl源代码.相当意外的特征,真正的意图,显然. (4认同)
  • 它不适用于"foo":`perl -E'$ | ="foo"; 说$ |'`0 (2认同)
  • @mob -OMFG.我正在转向Ruby!:) (2认同)

pil*_*row 6

哈! $|当"预先递减"时,在零(false,in perl)和one(true)之间翻转 - 它只能保存这些值.

因此,您的grep标准会在每次传递时更改,变为true,false,true,false等,因此返回列表中的每个其他元素.

太聪明了一半.