9

我是 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是否还有其他变体?

提前致谢。

4

5 回答 5

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
于 2013-04-17T12:30:34.230 回答
4

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

例如,3 & 1returns 1,它在 grep 中的计算结果为 true:

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

同样,4 & 1returns0为 false:

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
于 2013-04-17T12:42:32.507 回答
2
grep{ $_ & 1}

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

&  is the bitwise AND 
于 2013-04-17T12:30:23.567 回答
1

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

&是二元 AND 运算符。

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

perldoc中记录了$_with的使用。的含义也在perldoc中。grep&

于 2013-04-17T12:30:15.940 回答
0

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

于 2013-04-17T12:32:16.717 回答