我有一个CSV文件,我用它split来解析一个N项目数组,其中N是一个倍数3.
有没有办法可以做到这一点
foreach my ( $a, $b, $c ) ( @d ) {}
Run Code Online (Sandbox Code Playgroud)
类似于Python?
Eri*_*rom 14
我在CPAN 模块List :: Gen中解决了这个问题.
use List::Gen qw/by/;
for my $items (by 3 => @list) {
# do something with @$items which will contain 3 element slices of @list
# unlike natatime or other common solutions, the elements in @$items are
# aliased to @list, just like in a normal foreach loop
}
Run Code Online (Sandbox Code Playgroud)
您还可以导入该mapn函数,该函数用于List::Gen实现by:
use List::Gen qw/mapn/;
mapn {
# do something with the slices in @_
} 3 => @list;
Run Code Online (Sandbox Code Playgroud)
Sin*_*nür 12
您可以使用List :: MoreUtils :: natatime.来自文档:
my @x = ('a' .. 'g');
my $it = natatime 3, @x;
while (my @vals = $it->()) {
print "@vals\n";
}
Run Code Online (Sandbox Code Playgroud)
natatime在XS中实现,因此您应该更喜欢它以提高效率.仅用于说明目的,以下是如何在Perl中实现三元素迭代器生成器:
#!/usr/bin/perl
use strict; use warnings;
my @v = ('a' .. 'z' );
my $it = make_3it(\@v);
while ( my @tuple = $it->() ) {
print "@tuple\n";
}
sub make_3it {
my ($arr) = @_;
{
my $lower = 0;
return sub {
return unless $lower < @$arr;
my $upper = $lower + 2;
@$arr > $upper or $upper = $#$arr;
my @ret = @$arr[$lower .. $upper];
$lower = $upper + 1;
return @ret;
}
}
}
Run Code Online (Sandbox Code Playgroud)
my @list = (qw(one two three four five six seven eight nine));
while (my ($m, $n, $o) = splice (@list,0,3)) {
print "$m $n $o\n";
}
Run Code Online (Sandbox Code Playgroud)
这输出:
one two three
four five six
seven eight nine
Run Code Online (Sandbox Code Playgroud)