Perl grep над индексами массива - PullRequest
0 голосов
/ 19 февраля 2019

Я пытался разработать следующий код, который в конечном итоге возвращает индексы массива чисел в списке с нечетными цифрами.

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) в $_

Таким образом, $номеру присваивается фактическое значение элемента списка.

Я немного не уверен в том, что $_ в строке:

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

Является ли $ _ теперь каждой цифрой в действительном числе?Таким образом, для 16 это сначала 1, а затем 6. Я не знаком с синтаксисом «для разделения».

Спасибо за любую предложенную помощь

Джон

1 Ответ

0 голосов
/ 19 февраля 2019

$_ является переменной по умолчанию .Это глобальная переменная, которая устанавливается по умолчанию в различных операциях, таких как цикл for / foreach, и используется по умолчанию различными функциями.Это позволяет вам писать такие вещи, как print foreach @array;.

. for - это модификатор оператора , который является просто еще одним способом обернуть предыдущий оператор в цикл foreach * 1011.*.

split - это функция, которая разбивает свой аргумент, используя заданный шаблон, и возвращает список строк, которые затем повторяется в цикле foreach, и локально присваивает каждому элементу значение * 1016.*.

Чтобы этот оператор мог быть расширен до:

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

Его также можно упростить, используя sum из List :: Util :

use List::Util 'sum';
my $sum = sum split //, $number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...