Ваша вторая строка имеет более одного пробела между группой чисел и буквой, поэтому вы, вероятно, хотите \s+
оба раза вместо \s
во второй раз.
Вы не обязательно будете знать, сколько элементов у вас в массиве @value
в конце, поэтому вы можете поместить печать в цикл for
, а не предполагать, что у вас есть пятый элемент. (Может быть, вы знаете, что хотите первый и пятый, однако?) Последующие действия : в зависимости от ваших правок у вас есть более двух записей. Версия, которую я даю ниже, используя split
и \s+
, фиксирует число и букву для всех строк. Я настрою печатную часть сценария, чтобы показать вам, что я имею в виду.
Несколько других вещей:
- Вы должны всегда включать предупреждения.
- Нет причин читать весь файл в массив, а затем обрабатывать его построчно. Пропустите массив
@body
и просто сделайте то, что вам нужно в цикле while
.
- Используйте более современную форму
open
с лексическими дескрипторами файлов и тремя аргументами.
split
здесь мне кажется более простым, нежели регулярное выражение со снимками. Поскольку вы хотите захватить две определенные части строки, вы можете использовать split
с фрагментом массива, чтобы захватить эти два элемента и передать их в join
.
@value
- не особо полезное имя переменной, но я думаю, что вы должны хотя бы сделать его множественным. Думаю, это хорошая привычка, поскольку в массиве хранятся ваши множественные записи. (Это не жесткое и быстрое правило, но оно меня здесь напугало. Этот момент довольно незначительный.)
Вот как все это может выглядеть:
#!/usr/bin/env perl
use warnings;
use strict;
my @values;
# open my $filehandle, '<', '/usr/test'
# or die "Can't open /usr/test: $!";
while (my $line = <DATA>) {
chomp $line;
push @values, join('', (split /\s+/, $line)[1..2]);
}
for my $record (@values) {
print $record, "\n";
}
__DATA__
1389 E not
188 S yes
24 D yes
456 K not
2 Q yes