我在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 " ";
}
}
}
答案 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)
如果您不想使用任何外部模块,可以使用数组切片:
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";
}
答案 3 :(得分:4)
我的模块List::Gen中的函数by
和every
可以解决此问题:
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";
}
答案 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