小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

配列&ハッシュのアクセス方法いろいろ

配列やハッシュの要素へのアクセス方法は、大きく分けて3通りがあります。

  • インデックスでのアクセス
  • スライスでのアクセス
  • 配列をリファレンスでのアクセス

しかし、1以外は、ワーニングで、やはりインデックスでアクセスするのが常道のようです。


ちなみに、2は、以下のワーニングが出ます。
Scalar value @a[0] better written as $a[0]


またちなみに、3は、以下のワーニングが出ます。
Using an array as a reference is deprecated.

(D deprecated) @foo->[23] や @$ref->[99] の形で、配列をリファレンスとして使おうとしました。 5.6.1 以前のバージョンの perl ではこの構文を許していましたが、そうするべきではありません。これは今では非推奨であり、将来のバージョンでは削除されるでしょう。

http://d.hatena.ne.jp/fbis/20080304/1204621962

一次元

use strict;
use warnings;

my @a = (10, 20, 30);
# 以下は、すべて「10」と表示される
print $a[0], "\n";           # インデックスで@aの0番目要素をアクセス
print @a[0], "\n";           # スライスで@aの0番目要素をアクセス
print @a->[0], "\n";         # 配列をリファレンスで@aの0番目要素をアクセス

my %h = ('AA' => 100,
         'BB' => 200,
         'CC' => 300);
# 以下は、すべて「200」と表示される
print $h{BB}, "\n";          # インデックスで%hのBBキー要素をアクセス
print @h{BB}, "\n";          # スライスで%hのBBキー要素をアクセス
print %h->{BB}, "\n";        # 配列をリファレンスで%hのBBキー要素をアクセス?

2次元

use strict;
use warnings;

my @aa = ([ qw(aa ab ac) ],
          [ qw(ba bb bc) ],
          [ qw(ca cb cc) ]);
# 以下は、すべて「ab」と表示される
print ${$aa[0]}[1], "\n";    # インデックスで@aaの[0][1]要素をアクセス
print $aa[0]->[1], "\n";     # インデックスで@aaの[0][1]要素をアクセス
print $aa[0][1], "\n";       # インデックスで@aaの[0][1]要素をアクセス
print ${@aa[0]}[1], "\n";    # スライスで@aaの[0][1]要素をアクセス
print @aa[0]->[1], "\n";     # スライスで@aaの[0][1]要素をアクセス
print @aa->[0]->[1], "\n";   # 配列をリファレンスで@aaの[0][1]要素をアクセス
print @aa->[0][1], "\n";     # 配列をリファレンスで@aaの[0][1]要素をアクセス

my %hh = ('AA' => [ qw(aa ab ac) ],
          'BB' => [ qw(ba bb bc) ],
          'CC' => [ qw(ca cb cc) ]);
# 以下は、すべて「bb」と表示される
print ${$hh{BB}}[1], "\n";   # インデックスで%hhの{BB}[1]要素をアクセス
print $hh{BB}->[1], "\n";    # インデックスで%hhの{BB}[1]要素をアクセス
print $hh{BB}[1], "\n";      # インデックスで%hhの{BB}[1]要素をアクセス
print ${@hh{BB}}[1], "\n";   # スライスで%hhの{BB}[1]要素をアクセス
print @hh{BB}->[1], "\n";    # スライスで%hhの{BB}[1]要素をアクセス
print %hh->{BB}->[1], "\n";  # 配列をリファレンスでhhの{BB}[1]要素をアクセス
print %hh->{BB}[1], "\n";    # 配列をリファレンスでhhの{BB}[1]要素をアクセス