久しぶりにPerlでの開発を経験したので、自身への備忘録も含めて、記事にまとめます。
今回は配列/ハッシュの取り扱い方です。
※後で追加/編集する可能性があります。
初期化
旧式な方法
my @list1 = ( 1, 2, 3 );
my @list2 = qw/1 2 3/;
my %hash = ( 'name' => 'テスト太郎', 'age' => 10, 'email' => 'taro@test.com' );
print $list1[0]; # 1
print $list2[1]; # 2
print $hash{"name"}; # "テスト太郎"
- 変数宣言時は以下のようにする
- 配列:
@~
- ハッシュ:
%~
- 配列:
- 配列/ハッシュに格納済みの値への参照時は
$~
で参照する
モダンな方法
配列やハッシュでも@~
や%~
ではなく、$~
で宣言することも可能。
my $list = [ 1, 2, 3 ];
my $hash = ( 'name' => 'テスト太郎', 'age' => 10, 'email' => 'taro@test.com' );
print $list->[0]; # 1
print $hash->{"name"}; # "テスト太郎"
この場合は変数名の後に->
で配列のインデックスやハッシュのキーを指定する。
配列やハッシュとして扱いたい場合は、以下のように変数名の先頭に@~
や%~
を付ける。
print scalar @$list; #3
print scalar %$hash; #3
変換
文字列 => 配列
my $value = ™太郎 花子 次郎 三郎™;
my @names = split( /,/, $value );
print Dumper @names;
配列 => 文字列
my $names = qw/太郎 花子 次郎 三郎/;
my $value = join( ',', @$names );
print $value; #太郎,花子,次郎,三郎
配列 => ハッシュ
use strict;
use warnings;
use Data::Dumper;
my $user_list = [
{
'id' => 1,
'name' => 'テスト太郎',
'age' => 30,
'email' => 'taro@test.com',
},
{
'id' => 2,
'name' => 'テスト花子',
'age' => 26,
'email' => 'hanako@test.com',
},
{
'id' => 3,
'name' => 'テスト次郎',
'age' => 28,
'email' => 'jiro@test.com',
},
{
'id' => 4,
'name' => 'テスト三郎',
'age' => 22,
'email' => 'saburo@test.com',
},
];
# id => 各データのhash
my $user_hash = { map { $_->{'id'} => $_ } @$user_list };
print Dumper $user_hash;
# # id => nameのhash
my $user_names = { map { $_->{'id'} => $_->{'name'} } @$user_list };
print Dumper $user_names;
$VAR1 = {
'3' => {
'id' => 3,
'age' => 28,
'email' => 'jiro@test.com',
'name' => 'テスト次郎'
},
'1' => {
'name' => 'テスト太郎',
'age' => 30,
'id' => 1,
'email' => 'taro@test.com'
},
'2' => {
'name' => 'テスト花子',
'id' => 2,
'age' => 26,
'email' => 'hanako@test.com'
},
'4' => {
'email' => 'saburo@test.com',
'id' => 4,
'age' => 22,
'name' => 'テスト三郎'
}
};
$VAR1 = {
'3' => 'テスト次郎',
'2' => 'テスト花子',
'1' => 'テスト太郎',
'4' => 'テスト三郎'
};
繰り返し処理
# 各値のみ参照
my $names = [ "太郎", "花子", "次郎", "三郎" ];
foreach (@$names) {
print "$_ \n";
}
# インデックス付きで参照
foreach my $i ( 0 .. $#names ) {
print "$names[$i] \n";
}
my $hash ={ 'name' => 'テスト太郎', 'age' => 10, 'email' => 'taro@test.com' };
foreach ( keys(%$hash) ) {
print "$_ => $hash->{$_}\n";
}