Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 对于具有多个数组的_Perl_Raku - Fatal编程技术网

Perl 对于具有多个数组的

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

在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 $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>