为了从数组中得到奇数,我得到了这段代码但是没有理解一种语法。代码如下
#!/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; "
请帮我理解语法
答案 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运算的工作原理。
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;
性能差异可以忽略不计,而且发生的情况更为明显。