LoginSignup
0
4

More than 5 years have passed since last update.

Perlでの配列/ハッシュの取り扱い方

Last updated at Posted at 2017-12-16

久しぶりに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";
}
0
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4