如何迭代嵌套数组?

Maw*_*ter 2 arrays perl loops

我创建了一个数组如下

while (defined ($line = `<STDIN>`))

        {
        chomp ($line);
        push @stack,($line);
        }
Run Code Online (Sandbox Code Playgroud)

每行有两个数字.

15 6
2  8
Run Code Online (Sandbox Code Playgroud)

如何迭代每一行中的每个项目?

即我想要打印

15
6
2
8
Run Code Online (Sandbox Code Playgroud)

我明白它是这样的

foreach (@{stack}) (@stack){

    print "?????
}  
Run Code Online (Sandbox Code Playgroud)

这是我被困的地方.

bri*_*foy 10

请参阅perldsc文档.这是Perl数据结构手册,其中包含处理数组数组的示例.从你正在做的事情来看,它看起来不像你需要一个数组数组.

对于每行占两个数字并每行输出一个数字的问题,只需将空格转换为换行符:

 while( <> ) {
     s/\s+/\n/; # turn all whitespace runs into newlines
     print;     # it's ready to print
     }
Run Code Online (Sandbox Code Playgroud)

使用Perl 5.10,您可以使用\h仅匹配水平空格的新字符类:

 while( <> ) {
     s/\h+/\n/; # turn all horizontal whitespace runs into newlines
     print;     # it's ready to print
     }
Run Code Online (Sandbox Code Playgroud)

作为Perl单行,这只是:

 % perl -pe 's/\h+/\n/' file.txt
Run Code Online (Sandbox Code Playgroud)


Sin*_*nür 8

#!/usr/bin/perl

use strict;
use warnings;

while ( my $data = <DATA> ) {
    my @values = split ' ', $data;
    print $_, "\n" for @values;
}


__DATA__
15 6
2  8
Run Code Online (Sandbox Code Playgroud)

输出:

C:\Temp> h
15
6
2
8

或者,如果您想要存储每一行@stack并在以后打印出来:

my @stack = map { [ split ] } grep { chomp; length } <DATA>;
Run Code Online (Sandbox Code Playgroud)

上面的行将来自DATA文件句柄的所有内容都放入行列表中(因为<DATA>在列表上下文中发生).在grep咀嚼之后,每个线都会按照长度选择并过滤(以避免在数据文件中得到任何尾随的空行 - 如果没有则可以避免它).所述map然后沿着分割空间的每一行,并随后创建用于每行一个匿名数组引用.最后,这样的数组引用存储在每个元素中@stack.您可能希望用Data::Dumper@stack来了解正在发生的事情.

print join("\n", @$_), "\n" for @stack;
Run Code Online (Sandbox Code Playgroud)

现在,我们查看堆栈中的每个条目,依次取消引用每个数组,然后使用换行符连接每个数组的元素,以便每行打印一个元素.

输出:

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";
}
Run Code Online (Sandbox Code Playgroud)

最后,如果你想做除打印所有值之外的其他事情,比如总和所有数字,你应该为每个元素存储一个值@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;
Run Code Online (Sandbox Code Playgroud)