Я пытался разработать следующий код, который в конечном итоге возвращает индексы массива чисел в списке с нечетными суммами цифр.
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/foreach, и используется по умолчанию различными функциями. Это позволяет вам писать такие вещи, как print foreach @array;.
for — это модификатор оператора, который представляет собой еще один способ обернуть предыдущий оператор в цикл foreach.
расколоть — это функция, которая разбивает свой аргумент, используя заданный шаблон, и возвращает список строк, которые затем перебирает цикл foreach, и локально присваивает каждому элементу псевдоним $_.
Таким образом, это утверждение может быть расширено до:
foreach my $digit (split //, $number) {
$sum += $digit;
}
Его также можно упростить, используя сумма из List::Util:
use List::Util 'sum';
my $sum = sum split //, $number;
И perlmonks.org/?node_id=322751, правда с большим отступлением