#!/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:\温度> h
15
6
2
8
或者,如果您想将每一行存储在@stack 中并稍后打印出来:
my @stack = map { [ split ] } grep { chomp; length } <DATA>;
上面的行将来自DATA 文件句柄的所有内容都插入到行列表中(因为<DATA> 发生在列表上下文中)。 grep chomping 每一行并在 chomping 后按长度过滤(以避免在数据文件中出现任何尾随空行——如果没有空行,您可以避免它)。 map 然后沿空格分割每一行,然后为每一行创建一个匿名数组引用。最后,这样的数组引用存储在@stack 的每个元素中。您可能想使用Data::Dumper 查看@stack 以了解发生了什么。
print join("\n", @$_), "\n" for @stack;
现在,我们查看堆栈中的每个条目,依次解引用每个数组,然后用换行符连接每个数组的元素,以每行打印一个元素。
输出:
C:\温度> 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;