Snippets

sironekotoro Perlで、とある配列を指定した要素数ごとに別の配列リファレンスに分割する処理

Created by sironekotoro
use strict;
use warnings;
use feature qw/say/;

use Data::Dumper;

# Perlで、とある配列を指定した要素数ごとに別の配列リファレンスに分割する処理
# http://perl48.hatenablog.com/entry/2018/08/01/011811

my @arr = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 );

sub divided_arr_ref {

    # サブルーチンの引数をハッシュで受け取ると
    # 引数の順番を覚えなくて楽かもしれない
    my %argv = @_;

 # サブルーチン内の操作により引数の配列リファレンスに
 # 影響が及ばないようにするため、デリファレンスして
 # 配列にした上でサブルーチン内の配列@arrayに
 # コピーする。以降はこの配列@arrayを操作する
    my @array   = @{ $argv{array_ref} };
    my $divided = $argv{division};

    # このサブルーチンの返り値を格納する変数
    # 無名配列として扱う
    my $return = [];

    # 配列の要素が4つ以上あればwhileでループする
    while ( scalar @array > $divided ) {

        # 要素を4つ入れる、一時的な無名配列を用意する
        my $array_ref = [];

        # 配列から要素を4つ取り出して、一時的な
        # 無名配列にpushする
        # push時はデリファレンスして配列として
        # 扱えるようにする
        for ( my $i = 0; $i < $divided; $i++ ) {
            push @{$array_ref}, shift @array;
        }

        # 返り値用の変数$returnを無名配列にして、
        # 一時的な無名配列をpushする
        push @{$return}, $array_ref;
    }

    return $return;
}

say Dumper divided_arr_ref( array_ref => \@arr, division => '4' );

# テスト部
use Test::More;
my $expected = [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ], [ 9, 10, 11, 12 ] ];
is_deeply( divided_arr_ref( array_ref => \@arr, division => '4' ),
    $expected, 'ok' );

done_testing();

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.