从数组中获取奇数

时间:2013-08-11 17:42:00

标签: perl

为了从数组中得到奇数,我得到了这段代码但是没有理解一种语法。代码如下

#!/usr/bin/perl

use strict;
use warnings;

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

my @subArray = ();
  foreach (@array) {
  push @subArray, $_ if $_ & 1;
}
print "@subArray\n";
# displays: 3 5 7 9

什么是"如果$ _& 1" 这很有效。但我没有得到语法"如果$ _& 1"

类似地,grep可以像"我的@subArray = grep $ _& 1,@ array; "

请帮我理解语法

5 个答案:

答案 0 :(得分:4)

该行的结构是:

<statement> if <condition>

其中<statement>push @subArray, $_<condition>$_ & 1

根据$_ & 1的最低位是否设置,表达式$_为1或0。如果它是1(Perl中的true值),则执行push @subArray, $_;否则为0(Perl中的false值)并跳过该语句。

答案 1 :(得分:4)

什么是 $_ & 1

这个表达式将低位分开,只有低位组(奇数)的数字

  • $_是默认变量,在本例中是每个数组元素
  • &是二进制AND运算符/按位字符串运算符(一点一点地返回其操作数)
  • 1只是一个

  • 有关详细说明,请参阅perldoc perlop(乘法运算符)和bit-hacks

或者,您可以使用模运算符%解析偶数/奇数。

使用for循环。

my @odd;
for (@array) {
   push @odd, $_ if $_ % 2;
}

使用map

my @odd = map { $_ % 2 ? $_ : () } @array;

甚至是array slice使用grep ..

my @odd = @array[grep { ! ($_ % 2) } 0 .. $#array];

答案 2 :(得分:3)

上面已经解释了$_ & 1的含义,但在这种情况下,我相信如果你这样写的话会更容易维护:

my @oddArray = grep { $_ % 2 != 0 } @array;

答案 3 :(得分:2)

逻辑:
如果在奇数和1之间进行AND运算(当然是二进制),则获得的结果将始终为1.

工作原理:
上面的代码通过在数组元素和数字1之间执行按位AND运算来查找奇数。如果操作结果为“true”,则将其插入到最终数组(@subArray)中。这里的$ _指的是在迭代期间访问的原始数组的单个元素。

以下是按位AND运算的工作原理。

  1. 假设您要确定3是否为奇数(3 - > 0011的二进制)。
  2. 根据此代码,您正在使用1进行按位AND,二进制为0001。
  3. AND操作发生在0011和0001之间,由于它是按位,每个与另一个的相应位进行“与”运算。
  4. 这是怎么回事,
    二进制为3:0 0 1 1
    二进制1:0 0 0 1
    AND的结果:0 0 0 1
  5. 如您所见,最终结果为1,这也是最低位(从右开始的第一位)。因此,表达式if $_ & 1;会生成“true”,并通过subArray操作将数字插入push

答案 4 :(得分:1)

为什么不简单?

my @subArray = grep {$_ & 1} @array;

为什么在需要数字时使用qw(3 4 5 6 7 8 9)初始化数组?

my @array = (3, 4, 5, 6, 7, 8, 9);

好多了。您只是浪费CPU时间和内存,更重要的是误导您的代码读者。这指出了更明显的代码。

my @subArray = grep {$_ % 2} @array;

性能差异可以忽略不计,而且发生的情况更为明显。