配列とハッシュの要素数の求め方

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2009-07-19 配列とハッシュの要素数の求め方

Perlの場合、複雑なデータ構造は、配列とハッシュの組み合わせです。

通常、配列やハッシュを処理する時は、ループになりますね。

その時に、ループの最大値を指定しないとなりません。

ループの最大値は、普通、配列やハッシュの要素数-1になります。


実は、複雑なデータ構造の時、ループの最大値を求めるのに悩む時があるのです。

そこで、以下にアンチョコを用意してみました。

参考になれば、幸いです。


◆ 基本的な配列とハッシュの要素数の求め方(最大インデックスもあり)

◆ アンチョコ
use strict;
use warnings;

print "◆ 配列 -----------------------------------------\n";
my @aa = (1, 2, 3);
print $#aa, "\n";                     # 配列最大インデックス
print scalar(@aa), "\n";              # 配列要素数
print $aa[0], "\n";                   # 要素アクセス例


print "◆ ハッシュ -------------------------------------\n";
my %hh = (a => 1, b => 2, c => 3);
print scalar(keys(%hh)), "\n";        # ハッシュ要素数
print scalar(values(%hh)), "\n";      # ハッシュ要素数
print $hh{a}, "\n";                   # 要素アクセス例


print "◆ 配列の配列 -----------------------------------\n";
my @aa_aa = ([1, 2, 3, 4], 
             [5, 6, 7, 8], 
             [9, 10, 11, 12]);
print $#aa_aa, "\n";                  # 1次元配列最大インデックス
print scalar(@aa_aa), "\n";           # 1次元配列要素数
print $#{$aa_aa[0]}, "\n";            # 2次元配列最大インデックス
print scalar(@{$aa_aa[0]}), "\n";     # 2次元配列要素数
print $aa_aa[0][0], "\n";             # 要素アクセス例


print "◆ 配列のハッシュ -------------------------------\n";
my %hh_aa = (a => [1, 2, 3], 
             b => [4, 5, 6], 
             c => [7, 8, 9]);
print scalar(keys(%hh_aa)), "\n";     # 1次元ハッシュの要素数
print scalar(values(%hh_aa)), "\n";   # 1次元ハッシュの要素数
print $#{$hh_aa{a}}, "\n";            # 2次元配列最大インデックス
print scalar(@{$hh_aa{a}}), "\n";     # 2次元配列要素数
print $hh_aa{a}[0], "\n";             # 要素アクセス例


print "◆ ハッシュの配列 -------------------------------\n";
my @aa_hh = ({a => 1, b => 2}, 
             {c => 3, d => 4});
print $#aa_hh, "\n";                     # 1次元配列最大インデックス
print scalar(@aa_hh), "\n";              # 1次元配列要素数
print scalar(keys(%{$aa_hh[0]})), "\n";  # 2次元ハッシュの要素数
print scalar(values(%{$aa_hh[0]})), "\n";# 2次元ハッシュの要素数
print $aa_hh[0]{a}, "\n";                # 要素アクセス例


print "◆ ハッシュのハッシュ ----------------------------\n";
my %hh_hh = (x => {a => 1, b => 2}, 
             y => {c => 3, d => 4});
print scalar(keys(%hh_hh)), "\n";        # 1次元ハッシュの要素数
print scalar(values(%hh_hh)), "\n";      # 1次元ハッシュの要素数
print scalar(keys(%{$hh_hh{x}})), "\n";  # 2次元ハッシュの要素数
print scalar(values(%{$hh_hh{x}})), "\n";# 2次元ハッシュの要素数
print $hh_hh{x}{a}, "\n";                # 要素アクセス例


print "◆ 配列の配列の配列--------------------------------\n";
my @aa_aa_aa = ([[1, 1], [2, 2]], 
                [[3, 3], [4, 4]], 
                [[5, 5], [6, 6]]);
print $#aa_aa_aa, "\n";                  # 1次元配列最大インデックス
print scalar(@aa_aa_aa), "\n";           # 1次元配列要素数
print $#{$aa_aa_aa[0]}, "\n";            # 2次元配列最大インデックス
print scalar(@{$aa_aa_aa[0]}), "\n";     # 2次元配列要素数
print $#{$aa_aa_aa[0][0]}, "\n";         # 3次元配列最大インデックス
print scalar(@{$aa_aa_aa[0][0]}), "\n";  # 3次元配列要素数
print $aa_aa_aa[0][0][0], "\n";          # 要素アクセス例


print "◆ 配列の配列のハッシュ----------------------------\n";
my %hh_aa_aa = (a => [[1, 2], [3, 4]], 
                b => [[5, 6], [7, 8]]);
print scalar(keys(%hh_aa_aa)), "\n";            # 1次元ハッシュの要素数
print scalar(values(%hh_aa_aa)), "\n";          # 1次元ハッシュの要素数
print $#{$hh_aa_aa{a}}, "\n";                   # 2次元配列最大インデックス
print scalar(@{$hh_aa_aa{a}}), "\n";            # 2次元配列要素数
print $#{$hh_aa_aa{a}[0]}, "\n";                # 3次元配列最大インデックス
print scalar(@{$hh_aa_aa{a}[0]}), "\n";         # 3次元配列要素数
print $hh_aa_aa{a}[0][0], "\n";                 # 要素アクセス例


print "◆ 配列のハッシュの配列--------------------------\n";
my @aa_hh_aa = ({a => [1, 1], b => [2, 2]}, 
                {c => [3, 3], d => [4, 4]});
print $#aa_hh_aa, "\n";                         # 1次元配列最大インデックス
print scalar(@aa_hh_aa), "\n";                  # 1次元配列要素数
print scalar(keys(%{$aa_hh_aa[0]})), "\n";      # 2次元ハッシュの要素数
print scalar(values(%{$aa_hh_aa[0]})), "\n";    # 2次元ハッシュの要素数
print $#{$aa_hh_aa[0]{a}}, "\n";                # 3次元配列最大インデックス
print scalar(@{$aa_hh_aa[0]{a}}), "\n";         # 3次元配列要素数
print $aa_hh_aa[0]{a}[0], "\n";                 # 要素アクセス例


print "◆ 配列のハッシュのハッシュ--------------------------\n";
my %hh_hh_aa = (x => {a => [1, 1], b => [2, 2]}, 
                y => {c => [3, 3], d => [4, 4]});
print scalar(keys(%hh_hh_aa)), "\n";            # 1次元ハッシュの要素数
print scalar(values(%hh_hh_aa)), "\n";          # 1次元ハッシュの要素数
print scalar(keys(%{$hh_hh_aa{x}})), "\n";      # 2次元ハッシュの要素数
print scalar(values(%{$hh_hh_aa{x}})), "\n";    # 2次元ハッシュの要素数
print $#{$hh_hh_aa{x}{a}}, "\n";                # 3次元配列最大インデックス
print scalar(@{$hh_hh_aa{x}{a}}), "\n";         # 3次元配列要素数
print $hh_hh_aa{x}{a}[0], "\n";                 # 要素アクセス例


print "◆ ハッシュの配列の配列--------------------------\n";
my @aa_aa_hh = ([{a => 1, b => 2}, {c => 3, d => 4}], 
                [{e => 1, f => 2}, {g => 3, h => 4}]);
print $#aa_aa_hh, "\n";                         # 1次元配列最大インデックス
print scalar(@aa_aa_hh), "\n";                  # 1次元配列要素数
print $#{$aa_aa_hh[0]}, "\n";                   # 2次元配列最大インデックス
print scalar(@{$aa_aa_hh[0]}), "\n";            # 2次元配列要素数
print scalar(keys(%{$aa_aa_hh[0][0]})), "\n";   # 3次元ハッシュの要素数
print scalar(values(%{$aa_aa_hh[0][0]})), "\n"; # 3次元ハッシュの要素数
print $aa_aa_hh[0][0]{a}, "\n";                 # 要素アクセス例


print "◆ ハッシュのハッシュの配列--------------------------\n";
my @aa_hh_hh = ({x => {a => 1, b => 2}, y => {c => 3, d => 4}}, 
                {z => {e => 1, f => 2}});
print $#aa_hh_hh, "\n";                           # 1次元配列最大インデックス
print scalar(@aa_hh_hh), "\n";                    # 1次元配列要素数
print scalar(keys(%{$aa_hh_hh[0]})), "\n";        # 2次元ハッシュの要素数
print scalar(values(%{$aa_hh_hh[0]})), "\n";      # 2次元ハッシュの要素数
print scalar(keys(%{$aa_hh_hh[0]{x}})), "\n";     # 3次元ハッシュの要素数
print scalar(values(%{$aa_hh_hh[0]{x}})), "\n";   # 3次元ハッシュの要素数
print $aa_hh_hh[0]{x}{a}, "\n";                   # 要素アクセス例


print "◆ ハッシュの配列のハッシュ--------------------------\n";
my %hh_aa_hh = (z1 => [{a1 => 1, b1 => 2}, {x1 => 1, y1 => 2}], 
                z2 => [{a2 => 1, b2 => 2}, {x2 => 1, y2 => 2}]);
print scalar(keys(%hh_aa_hh)), "\n";              # 1次元ハッシュの要素数
print scalar(values(%hh_aa_hh)), "\n";            # 1次元ハッシュの要素数
print $#{$hh_aa_hh{z1}}, "\n";                    # 2次元配列最大インデックス
print scalar(@{$hh_aa_hh{z1}}), "\n";             # 2次元配列要素数
print scalar(keys(%{$hh_aa_hh{z1}[0]})), "\n";    # 3次元ハッシュの要素数
print scalar(values(%{$hh_aa_hh{z1}[0]})), "\n";  # 3次元ハッシュの要素数
print $hh_aa_hh{z1}[0]{a1}, "\n";                 # 要素アクセス例


print "◆ ハッシュのハッシュのハッシュ----------------------\n";
my %hh_hh_hh = (z1 => {x1 => {a1 => 1, b1 => 2}, y1 => {c1 => 3, d1 => 4}}, 
                z2 => {x2 => {a2 => 1, b2 => 2}, y2 => {c2 => 3, d2 => 4}});
print scalar(keys(%hh_hh_hh)), "\n";              # 1次元ハッシュの要素数
print scalar(values(%hh_hh_hh)), "\n";            # 1次元ハッシュの要素数
print scalar(keys(%{$hh_hh_hh{z1}})), "\n";       # 2次元ハッシュの要素数
print scalar(values(%{$hh_hh_hh{z1}})), "\n";     # 2次元ハッシュの要素数
print scalar(keys(%{$hh_hh_hh{z1}{x1}})), "\n";   # 3次元ハッシュの要素数
print scalar(values(%{$hh_hh_hh{z1}{x1}})), "\n"; # 3次元ハッシュの要素数
print $hh_hh_hh{z1}{x1}{a1}, "\n";                # 要素アクセス例

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう