代码之家  ›  专栏  ›  技术社区  ›  Mark B

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

  •  2
  • Mark B  · 技术社区  · 14 年前

    我在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 回复  |  直到 12 年前
        1
  •  6
  •   mob    14 年前

    我喜欢 splice 对于这样的工作:

    sub PrintArrayWithNewlines {
        my $n = 10;
        my $delim = " ";
        while (my @x = splice @_, 0, $n) {
            print join($delim, @x), "\n";
        }
    }
    
        2
  •  6
  •   Colin Pickard    12 年前

    你可以用 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
        3
  •  4
  •   Sinan Ünür    14 年前

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

    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
  •  4
  •   Eric Strom    14 年前

    功能 by every 在我的模块中 List::Gen 可以解决这个问题:

    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";
    }
    
        5
  •  1
  •   Alex Reynolds    14 年前

    您也可以使用 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