我一直在尝试编写以下代码,该代码最终返回具有奇数位和的列表中数字的数组索引。
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'语法不熟悉。
感谢您提供的任何帮助
约翰
答案 0 :(得分:0)
$_
是default variable。它是一个全局变量,默认情况下会在各种操作(例如,for / foreach循环)中进行设置,并在默认情况下由各种功能使用。这使您可以编写类似print foreach @array;
之类的东西。
for
是statement 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;