如何使用每行分隔符打印N个数组元素?

时间:2010-03-25 19:02:16

标签: perl

我在Perl中有一个数组我希望在每个元素之间使用空格分隔符进行打印,除了应该换行符分隔的每个第10个元素。如果重要的话,元素中没有任何空格。

我已经用for和一个计数器编写了一个函数,但是我想知道是否有更好/更短/规范的Perl方式,可能是一个特殊的连接语法或类似方法。

我的功能来说明:

sub PrintArrayWithNewlines
{
    my $counter = 0;
    my $newlineIndex = shift @_;

    foreach my $item (@_)
    {
        ++$counter;
        print "$item";
        if($counter == $newlineIndex)
        {
            $counter = 0;
            print "\n";
        }
        else
        {
            print " ";
        }
    }
}

5 个答案:

答案 0 :(得分:6)

您可以使用List::MoreUtils::natatime

use warnings; use strict;

use List::MoreUtils qw( natatime );

my @x = (1 .. 35);

my $it = natatime 10, @x;

while ( my @v = $it->() ) {
    print "@v\n"
}

输出:

C:\Temp> x
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35

答案 1 :(得分:6)

我喜欢splice这样的工作:

sub PrintArrayWithNewlines {
    my $n = 10;
    my $delim = " ";
    while (my @x = splice @_, 0, $n) {
        print join($delim, @x), "\n";
    }
}

答案 2 :(得分:4)

我的模块List::Gen中的函数byevery可以解决此问题:

use List::Gen;

for (every 10 => 'a' .. 'z') {
    print "@$_\n"
}

#   a b c d e f g h i j
#   k l m n o p q r s t
#   u v w x y z

它也可以写成

foreach (by 10 => 'a' .. 'z') {
    print "@$_\n"
}

或使用功能形式:

mapn {print "@_\n"} 10 => 'a' .. 'z';  # @_ not @$_ here

或迭代器,如果这是你的风格:

my $letters = by 10 => 'a' .. 'z';

while (my $line = $letters->next) {
   print "@$line\n";
}

答案 3 :(得分:4)

如果您不想使用任何外部模块,可以使用数组切片:

use warnings; use strict;

my @x = (1 .. 95);
my $n = 10;

for my $i ( 0 .. int @x/$n ) {
    no warnings 'uninitialized';
    print "@x[$n * $i .. $n * ($i + 1) - 1]\n";
}

答案 4 :(得分:1)

您还可以使用map修改PrintArrayWithNewlines

#!/usr/bin/perl -w

use strict;

sub PrintArrayWithNewlines 
{    
    my @array = @_;
    my $newlineIndex = 10;

    foreach my $item (@array) {
        ++$globalCounter;
        print "$item";
        if ($globalCounter == $newlineIndex) {
            $globalCounter = 0;
            print "\n";
        }
        else {
            print " ";
        }
    }
}

my $globalCounter = 0;
my @myArray = 'a' .. 'z'
map { PrintArrayWithNewlines($_) } @myArray;
print "\n";

输出结果为:

$ ./test.pl
a b c d e f g h i j
k l m n o p q r s t
u v x y z