我正在寻找的是:
@list = qw(1 2 3 4 5 6); foreach (@list) { #perl magic goes here print "i: $i, j:$j\n"; }
收益:
i:1, j:2 i:3, j:4 i:5, j:6
为了回应下面的一个非常好的建议,我需要指定此脚本将在其他人的构建服务器上运行,并且我不允许使用CPAN中的任何模块.仅限标准Perl.
我认为正确的方法是使用来自List :: MoreUtils的natatime:
来自文档:
natatime BLOCK LIST
创建一个数组迭代器,用于一次循环一个
$n
项目块中的数组.(n
一次,得到它?).一个例子可能是一个比我用文字更好的解释.
例:
my @x = ('a' .. 'g'); my $it = natatime 3, @x; while (my @vals = $it->()) { print "@vals\n"; }
这打印
a b c d e f g
执行List::MoreUtils::natatime
:
sub natatime ($@) { my $n = shift; my @list = @_; return sub { return splice @list, 0, $n; } }
我会用拼接.
my @list = qw(1 2 3 4 5 6); while(my ($i,$j) = splice(@list,0,2)) { print "i: $i, j: $j\n"; }
我想你想要以不同的方式做到这一点.试试这个:
while (scalar(@list) > 0) { $i = shift(@list); $j = shift(@list); print "i: $i, j:$j\n"; }
请记住,这将破坏列表,但它将适用于那个小循环.
say
:use Modern::Perl; use List::AllUtils qw'zip'; my @array = zip @{['a'..'z']}, @{[1..26]} ;
{ my $i = 0; while( (my($a,$b) = @array[$i++,$i++]), $i <= @array # boolean test ){ say "$a => $b"; } }
List::Pairwise
(pair)
use List::Pairwise qw'pair'; for my $pair (pair @array){ my($a,$b) = @$pair; say "$a => $b"; }
List::MoreUtils
(natatime)
use List::AllUtils qw'natatime'; my $iter = natatime 2, @array; while( my($a,$b) = $iter->() ){ say "$a => $b"; }
{ my %map = @array; for my $key (keys %map){ my $value = $map{$key}; say "$key => $value"; } }
不幸的是,最接近的等同物是老派:
for(my $ix = 0; $ix <= $#list; $ix += 2) { my $i = $list[$ix]; my $j = $list[$ix + 1]; print "i: $i, j:$j\n"; }
我更喜欢Jack M的答案,但是我会用更性感的Perl来写它:
while(@list) { my $i = shift @list; my $j = shift @list; print "i: $i, j:$j\n"; }
如果我只能使用没有模块的标准Perl,我可能会下降到一个C风格的for循环,数量为2:
for( my $i = 0; $i < @array; $i += 2 ) { my( $i, $j ) = @array[ $i, $i+1 ]; ... }
但是,如果您想从其中一个无法使用的模块中获得某些东西,您可以将该模块添加到您的代码中.如果您可以编写代码,则可以使用模块.您可能只需要在模块中包含您在@INC
适当设置时提供的所有代码.这是inc :: Module :: Install和PAR的基本思想.
我花了很多时间使用构建系统来创建自己的CPAN存储库,从其私有CPAN安装其依赖项,然后测试代码.拥有构建服务器场并不排除使用模块; 这是当地的政策.然而,即使有可能,这在所有情况下都没有意义.