Как я могу напечатать только четные строки массива в perl?

Я новичок в Perl и пытаюсь написать скрипт, который будет печатать только четные строки массива. Я пробовал несколько разных методов нахождения размера для использования в качестве условия для моего цикла while, но я всегда получаю бесконечный цикл первой строки без завершения программы. Вводимый массив представляет собой текстовый файл, ввод с формой "program.pl

@input = <stdin>;
$i = $1;
$size = $#input + $1;
while ($size >= $i) {
 print "$input[$i]";
 $i = ($i + $2);
}
</stdin>
4 ответа

Не вызывайте свою проблему с помощью

program.pl < foo.txt

Вместо этого просто передайте 'foo.txt' в качестве параметра:

program.pl foo.txt

Внутри вашего сценария полагайтесь на чтение по умолчанию из <> и номер строки переменной $. :

use strict;
use warnings;

while (<>) {
 next if $. % 2; # Skip odd numbers.
 print;
}


Предполагая, что у вас уже есть массив со всеми вашими @input, в вашем примере @input вы можете получить все четные записи индекса в другой массив, используя массив Array Slice, например:

my @input_even_entries_only = @input[grep { $_ % 2 == 0 } 0..$#input];

Выражение в квадратных скобках оценивается ко всем четным числам от 0 до $#input.

Затем вы можете использовать обычный for/foreach цикла, чтобы пройти через результирующий массив:

for my $val (@input_even_entries_only) {
 print "$val";
}


Если вы пытаетесь напечатать строки массива, индексированные на четные числа, попробуйте следующее:

use strict;
use warnings;

my @input = <data>;
for(my $i=0; $i<=$#input; $i+=2) {
 print $input[$i];
}

__DATA__
1
2
3
4
5
6
</data>

Вывод:

1
3
5


Я понятия не имею, что вы делаете с переменными $1 и $2. Вы считали, что это просто цифры?

Когда вы используете переменную, которой не присвоено значение, она не определена, и при использовании в числовом контексте она будет преобразована в 0. Если вы не используете use warnings, это делается тихо и будет довольно запутанным.

Кроме этого, ваш код не слишком далеко. Это должно быть что-то вроде:

use strict;
use warnings;

my @input = <>; # <> is more flexible and does the same thing
my $i = 1;
while ($i <= $#input) {
 print $input[$i];
 $i += 2;
}

Хотя, конечно, хранение всего файла в массиве не требуется, и чаще всего вам нужно просто перебрать его. Как показал Миллер в своем ответе, это, вероятно, решение, которое я бы предложил. Использование цикла for такого как JS- шоу, является отличным способом управления контуром.

licensed under cc by-sa 3.0 with attribution.