perlスライス

perlのスライスってわかりづらいよね。

use strict;
use warnings;

use Test::More;

my %hash = ( key1 => 'val1', key2 => 'val2' );

# スライス
my ( $a, $b ) = @hash{qw/key1 key2/};
is $a, 'val1', 'val1';
is $b, 'val2', 'val2';

# keysを使っても取れるが、順番はランダム
my ( $a1, $b1 ) = @hash{ keys %hash };
is_deeply + { $a1 => 1, $b1 => 1 }, +{ 'val1' => 1, 'val2' => 1 }, "keys";

# ハッシュリファレンスでも使えます
my $hash = +{ key1 => 'val1', key2 => 'val2' };
my ( $a2, $b2 ) = @$hash{qw/key1 key2/};
is $a2, 'val1', 'hash ref val1';
is $b2, 'val2', 'hash ref val2';

# マージにも使えますね
my $hash1 = +{ key1 => 'val1', key2 => 'val2' };
my $hash2 = +{ key3 => 'val3', key4 => 'val4' };
my $ret = +{
key1 => 'val1',
key2 => 'val2',
key3 => 'val3',
key4 => 'val4',
};

@$hash2{ keys %$hash1 } = @$hash1{ keys %$hash1 };
is_deeply $hash2, $ret, 'merge';

# 単純なマージならこれでもできます
my $hash3 = +{ %$hash2, %$hash1 };
is_deeply $hash3, $ret, 'merge2';

done_testing;

0 件のコメント:

コメントを投稿

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...