如何迭代嵌套数组?

时间:2009-10-15 10:22:54

标签: perl arrays loops

我创建了一个数组如下

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

        {
        chomp ($line);
        push @stack,($line);
        }

每行有两个数字。

15 6
2  8

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

即。我想打印

15
6
2
8

我理解它就像

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

    print "?????
}  

这就是我被困住的地方。

5 个答案:

答案 0 :(得分:10)

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

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

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

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

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

作为一个Perl单行,那就是:

 % perl -pe 's/\h+/\n/' file.txt

答案 1 :(得分: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

输出:

C:\Temp> h
15
6
2
8

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

my @stack = map { [ split ] } grep { chomp; length } <DATA>;

上面的行将来自DATA文件句柄的所有内容都放入行列表中(因为<DATA>发生在列表上下文中)。 grep选中每一行并在咀嚼后按长度过滤(以避免在数据文件中获得任何尾随空行 - 如果没有则可以避免它)。然后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;

答案 2 :(得分:0)

#!/usr/bin/perl

while ($line = <STDIN>) {
    chomp ($line);
    push @stack, $line;
}

# prints each line
foreach $line (@stack) {
    print "$line\n";
}

# splits each line into items using ' ' as separator
# and prints the items
foreach $line (@stack) {
    @items = split / /, $line;

    foreach $item (@items) {
        print $item . "\n";
    }
}

答案 3 :(得分:0)

我使用'for'代表“C”样式循环,'foreach'代表迭代列表。

答案 4 :(得分:0)

#!/usr/bin/perl

use strict;
use warnings;
open IN, "< read.txt" or
    die "Can't read in 'read.txt'!";

my $content = join '', <IN>;

while ($content =~ m`(\d+)`g) {
    print "$1\n";
}