它在perl中的工作原理是“$ _& 1”

时间:2013-04-17 12:25:15

标签: arrays perl

我是初学者,我正在阅读grep函数来过滤列表。我遇到了以下程序。

#!/usr/bin/perl

use strict;
use warnings;

# initialize an array
my @array = qw(3 4 5 6 7 8 9);

# first syntax form:
my @subArray = grep { $_ & 1 } @array;

语句my @subArray = grep { $_ & 1 } @array;返回@array中的奇数。我不明白表达式($_ & 1)是如何工作的。我在谷歌搜索但没有找到任何有用的链接。

  • 这是一种特殊的操作员吗?

  • 是否有 EXPR 的其他变体?

先谢谢。

5 个答案:

答案 0 :(得分:10)

$_是保存当前测试值的变量,&是二元AND运算符,1只是第一个。该表达式通过逻辑AND将$_1的所有位相互组合。因此,如果值为奇数,则返回1;如果值为偶数,则返回0。

作为一个例子,假设$ _是123,那么它的二进制表示将是1111011。十进制数1将是00000001,因此将所有位组合为AND得到

123 = 1111011
  1 = 0000001
      - AND -
      0000001 = 1

另一个例子200 & 100

200 = 11001000
100 = 01100100
      - AND --
      01000000 = 64

答案 1 :(得分:4)

正如许多人所指出的,&是按位运算符。这意味着将比较的两个数字转换为比特并进行比较:

例如,3 & 1返回1,在grep中评估为true:

Num | Bits
----+-----
  3 | 1 1
& 1 | 0 1
----+-----
  1 | 0 1   <- result of 'and'ing each bit column

同样,4 & 1会返回0,这是假的:

Num | Bits
----+-------
  4 | 1 0 0
& 1 | 0 0 1
----+-------
  0 | 0 0 0  <- all zeros because no column contains 1 & 1

那就是说,过滤奇数的另一种方法是mod数字为2:

my @odd = grep { $_ % 2 } 1 .. 7;    # 1, 3, 5, 7

答案 2 :(得分:2)

grep{ $_ & 1}

将遍历数组的每个元素并与1进行逐位匹配 这意味着grep将匹配任何具有1作为最后(lsb)位的元素。 由于只有奇数的1为lsb,因此只返回奇数

&  is the bitwise AND 

答案 3 :(得分:1)

$_是当前表达式。在这种情况下,每个数组元素。

&是二元AND运算符。

因此,简而言之,grep将匹配任何奇数的数组元素。

$_中记录了grep&的使用情况。 {{1}}的含义也在perldoc

答案 4 :(得分:0)

$_是由grep函数设置的变量。如果没有另外指定,大多数perl函数操作$ _。 Grep为@array的每个元素调用已定义的匿名子({ $_ & 1 }),并按位&。如果结果为真值,则将其添加到结果数组中。