#!/usr/bin/perl
use strict;
use warnings;
while (my $data = <DATA>) {
my @values = split ' ', $data;
print $_, "\n" for @values;
}
__DATA__
15 6
2 8
Выход:
C:\Temp> h
15
6
2
8
В качестве альтернативы, если вы хотите сохранить каждую строку в @stack
и распечатать позже:
my @stack = map { [ split ] } grep { chomp; length } <DATA>;
Линия выше хлебает все исходящее от DATA
файлового дескриптора в список (потому что <DATA>
происходит в контексте списка). grep
chomps каждую строку и фильтрует по длине после chomping (чтобы избежать получения каких-либо завершающих пустых строк в файле данных - вы можете избежать этого, если их нет). Затем map
разбивает каждую строку вдоль пробелов, а затем создает ссылку на анонимный массив для каждой строки. Наконец, такие ссылки на массивы хранятся в каждом элементе @stack
. Вы можете использовать Data::Dumper
, чтобы посмотреть на @stack
, чтобы понять, что происходит.
print join("\n", @$_), "\n" for @stack;
Теперь мы смотрим на каждую запись в стеке, разыменования каждый массив в свою очередь, затем соединения элементов каждого массива с новой строкой, чтобы напечатать один элемент в каждой строке.
Выход:
C:\Temp> h
15
6
2
8
Долгий путь написания по существу то же самое (с меньшим потреблением памяти) будет:
my @stack;
while (my $line = <DATA>) {
last unless $line =~ /\S/;
my @values = split ' ', $line;
push @stack, \@values;
}
for my $ref (@stack) {
print join("\n", @$ref), "\n";
}
Наконец, если вы хотите сделать что-то другое, чем печать всех значений , скажем, суммировать все числа, вы должны сохранить одно значение на элемент @stack
:
use List::Util qw(sum);
my @stack;
while (my $line = <DATA>) {
last unless $line =~ /\S/;
my @values = split ' ', $line;
push @stack, @values;
}
printf "The sum is %d\n", sum @stack;
Не понимаю, как то, что вы хотите распечатать, отличается от того, что у вас есть. Кроме того, эти backticks не выглядят правильно. – 2009-10-15 10:33:04
То же самое на задних скоростях. Удалите их и используйте 'while (my $ line = <>)'. –
'while (my $ line = <>)' автоматически преобразуется в 'while (определяется (my $ line = <>))' –