Perl Grep超过数组索引

时间:2019-02-19 19:30:11

标签: perl grep

我一直在尝试编写以下代码,该代码最终返回具有奇数位和的列表中数字的数组索引。

my @input_numbers = (1,2,4,8,16,32,64);
my @indices_of_odd_digit_sums = grep {
my $number = $input_numbers[$_];
my $sum;
$sum += $_ for split //, $number;
$sum % 2;
} 0..$#input_numbers;

print "@indices_of_odd_digit_sums";

我认为已经解决了该脚本正在使用$input_numbers[$_]的问题,因为grep正在将数组索引(0..6)放入$_

这样,为$ number分配了列表项的实际值。

我不确定该行中的$_

$sum += $_ for split //, $number;

$ _现在是实际数字中的每个数字吗?因此,对于16,它首先是1,然后是6。我对'for split'语法不熟悉。

感谢您提供的任何帮助

约翰

1 个答案:

答案 0 :(得分:0)

$_default variable。它是一个全局变量,默认情况下会在各种操作(例如,for / foreach循环)中进行设置,并在默认情况下由各种功能使用。这使您可以编写类似print foreach @array;之类的东西。

forstatement modifier,这是将前面的语句包装在foreach loop中的另一种方式。

split是一个函数,该函数使用给定的模式拆分其参数,并返回字符串列表,然后foreach循环对其进行迭代,并将每个元素局部别名为$_

因此该语句可以扩展为:

foreach my $digit (split //, $number) {
  $sum += $digit;
}

也可以使用sum from List::Util进行简化:

use List::Util 'sum';
my $sum = sum split //, $number;