Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 它是如何工作的&;1“;在perl中_Arrays_Perl - Fatal编程技术网

Arrays 它是如何工作的&;1“;在perl中

Arrays 它是如何工作的&;1“;在perl中,arrays,perl,Arrays,Perl,我是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返回数组中的奇数。我不明白表达式($\u1)

我是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
返回数组中的奇数。我不明白表达式(
$\u1
)是如何工作的。我在谷歌搜索,但没有找到任何有用的链接

  • 那是什么特殊的接线员吗

  • 是否有其他类型的EXPR


提前感谢。

$\u
是当前的表达式。在本例中,每个数组元素

&
是二进制AND运算符

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

$\uu
grep
一起使用的过程记录在中。
&
的含义也在中

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

&  is the bitwise AND 

$
是保存当前测试值的变量,
&
是二进制AND运算符,
1
只是数字1。此表达式通过逻辑and将
$\uuu
1
的所有位组合在一起。因此,如果值为奇数,则返回1;如果值为偶数,则返回0

例如,假设$是123,那么它的二进制表示形式是
1111011
。十进制数1将是
00000001
,因此将所有位按组合,得到

123 = 1111011
  1 = 0000001
      - AND -
      0000001 = 1
另一个示例
200和100

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

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

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

例如,
3&1
返回
1
,在grep中计算为true:

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

也就是说,过滤奇数的另一种方法是使用2:

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

在第二个例子中(
200&100
),答案是
64
,还是我的转换方式错了?你是对的,当然是64。128是我的一个错误。仅供参考:这是一个非常巧妙的技巧,不应该在生产代码中使用,除非只查找奇数元素的操作在更可读的实现中被基准化为性能瓶颈。@DVK Hm,至于我的兴趣:是否使用了此技巧
$| |=$val
@loldop-
| |=
运算符是完全正确的惯用Perl,而不是黑客。但是,使用
$
而不是使用自文档命名的variavle通常是写得很差的代码的标志,除非在非常短的
映射中使用
/
grep
块。@VARamesh,我想,您可以使用以下表达式:
($%2)
元素,它们在环模中有剩余的12@DVK谢谢你提供的信息。
Num | Bits
----+-------
  4 | 1 0 0
& 1 | 0 0 1
----+-------
  0 | 0 0 0  <- all zeros because no column contains 1 & 1
my @odd = grep { $_ % 2 } 1 .. 7;    # 1, 3, 5, 7