Skip to content

Pythonのzipに準ずるPerlのzip

2022年4月3日

やりたいこと

2つの配列を次のように処理したい。

[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]

to

[[1,6], [2,7], [3,8], [4,9], [5,10]]

コード

moduleを使う場合

https://metacpan.org/pod/List::Zip

use strict;
use warnings;
use utf8;
use Data::Dumper;
use List::Zip;

my @a = (1,2,3,4,5);
my @b = (6,7,8,9,10);
my @ab = zip(\@a, \@b);

print Dumper(\@ab);

moduleを使わない場合

参考: https://www.koikikukan.com/archives/2014/07/03-005555.php

use strict;
use warnings;
use utf8;
use Data::Dumper;

sub zip {
    my ($x, $y) = @_;
    my $len = @$x;
    my @aa;
    for (my $i = 0; $i < $len; $i++) {
        push @{$aa[$i]}, @$x[$i];
        push @{$aa[$i]}, @$y[$i];
    }
    return @aa;
}

my @a = (1,2,3,4,5);
my @b = (6,7,8,9,10);
my @ab = zip(\@a, \@b);

print Dumper(\@ab);

実行結果

$perl zip.pl
$VAR1 = [
          [
            1,
            6
          ],
          [
            2,
            7
          ],
          [
            3,
            8
          ],
          [
            4,
            9
          ],
          [
            5,
            10
          ]
        ];

面白い部分

moduleを使わない場合にて、zip関数の引数としてzip(\@a, \@b)と、配列のリファレンスを渡している。 受け取り側はmy ($x, $y) = @_;と、スカラで受け取る。 もしそのまま配列で渡し受けると、@a@bがくっついて(1,2,3,4,5,6,7,8,9,10)が渡され、 受け取り側は@x(1,2,3,4,5,6,7,8,9,10)@yundefとなる。