Perl 对于具有多个数组的
在Scheme中,您可以使用Perl 对于具有多个数组的,perl,raku,Perl,Raku,在Scheme中,您可以使用对每个列表迭代多个列表: > (for-each (lambda (a b) (display (+ a b)) (newline)) '(10 20 30) '(1 2 3)) 11 22 33 > 我知道,在Perl中,您可以使用for对单个列表进行迭代。在Scheme示例中,迭代多个列表的好方法是什么 我对Perl 5或6的答案感兴趣。一种方法是: sub for_each { my $proc = shift ; my $le
对每个列表迭代多个列表:
> (for-each (lambda (a b) (display (+ a b)) (newline)) '(10 20 30) '(1 2 3))
11
22
33
>
我知道,在Perl中,您可以使用for
对单个列表进行迭代。在Scheme示例中,迭代多个列表的好方法是什么
我对Perl 5或6的答案感兴趣。一种方法是:
sub for_each
{
my $proc = shift ;
my $len = @{$_[0]} ;
for ( my $i = 0 ; $i < $len ; $i++ )
{
my @args = map $_->[$i] , @_ ;
&$proc ( @args ) ;
}
}
for_each sub { say $_[0] + $_[1] } , ([10,20,30],[1,2,3])
感谢Alex指出的List::MoreUtils
,使用Zip操作符,您可以实现Scheme的功能:
> .say for (10, 20, 30) Z+ (1, 2, 3)
11
22
33
请参见Perl 5中的,您可以使用该模块。使用两两或每个_数组返回的迭代器(可能需要两个以上的数组并行迭代)
如果确定数组的索引大小相同,则可以迭代数组的索引:
foreach( 0 .. $#array1 ) {
print $array1[$_] + $array2[$_], "\n";
}
提供了一个MapCar函数,用于迭代多个数组(使用不同的变量处理大小不等的数组)。在Perl 6中,Zip操作符是最好的选择。如果您想同时获得两个值(而不是直接计算总和),可以不使用加号:
for (10, 11, 12) Z (1, 2, 3) -> $a, $b {
say "$a and $b";
}
一个解决方案(有许多可供选择)可能如下所示:
my @argle = (10, 20, 30);
my @bargle = (1, 2, 3);
do {
my $yin = shift @argle;
my $yang = shift @bargle;
say $yin + $yang;
} while (@argle && @bargle);
my @argle = (10, 20, 30);
my @bargle = (1, 2, 3);
for my $yin (@argle) {
my $yang = shift @bargle;
say $yin + $yang;
}
我感觉到您正在询问有关foreach的foreach
,可能是这样的:
my @argle = (10, 20, 30);
my @bargle = (1, 2, 3);
do {
my $yin = shift @argle;
my $yang = shift @bargle;
say $yin + $yang;
} while (@argle && @bargle);
my @argle = (10, 20, 30);
my @bargle = (1, 2, 3);
for my $yin (@argle) {
my $yang = shift @bargle;
say $yin + $yang;
}
但在这种情况下就不那么顺利了。如果其中一个数组较短,会发生什么情况 只要问题简单到加(/乘,除,…)和
阵列不是阵列的阵列,您还可以使用hyper运算符执行任务:
<1 2 3> «+» <10 20 30>
谢谢塔齐克。每一个的方案概括为一个或多个列表。zip可以用于两个以上的列表吗?它可以,尽管Rakudo目前只实现两个列表(已知的限制)。谢谢mortiz!见我对塔齐克回答的评论。
<1 2 3> <<+>> <10 20 30>