Perl基礎入門 ¦ KentWeb Perl tutorial: A basic program KentWeb > Perl基礎入門 Perl基礎入門 powered by KentWeb 第 4 章 ハッシュ変数 4-1. 4-2. 4-3. 4-4. 4-5. 4-6. ハッシュ変数とは ハッシュ変数の操作 ハッシュ関数 ハッシュスライス ハッシュを代入順に並べる 多次元ハッシュ Profile KENT。KentWeb主催者。 初心者による初心者のための Perl入門ページです。 4-1. ハッシュ変数とは 目次 0. 目次(トップ) ハッシュとは、連想配列とも呼ばれ、「キー」と「値」を1組のペアとして関連付けされた配列です。 ただし、配 1. Perlの概要 2. スカラー変数 列自体は順序付けされていないところに特徴があります。 3. リストと配列 4. ハッシュ変数 字およびアンダースコア ( _ ) を用いることができます。また大文字と小文字が区別されますので、たとえば %a 5. 制御構造 6. ファイル操作とハンドル と %A は別物として扱われます。 ハッシュの変数のことを、ハッシュ変数といい、% (パーセント) + 英字1文字から始まり、それ以降は数字、英 7. 正規表現 8. サブルーチン 9. 文字列とディレクトリ操作 4-2. ハッシュ変数の操作 ハッシュ変数は、キーと値をペアにして、数値や文字列を代入します。 %fruit = ("red" => "apple", "yellow" => "banana"); 上記の場合、red(キー)とapple(値)というペアと、yellow(キー)とbanana(値)というペアを、それぞ れ%fruitに代入します。 Google ads 多機能UMLツール sparxsystems.jp/ UML2.4だけでな くSysML・DFD・BPMN にも 対応 10言語のコード生成に対 応 ハッシュ変数の中の各要素(各ペア)は、$ハッシュ変数名 { キー } という形式で、それに対応する「値」を参 照することができます。 したがって、前述の%fruitは、以下のように記述することもできます。 $fruit{"red"} = "apple"; $fruit{"yellow"} = "banana"; ハッシュ変数の各要素には、「キー」を指定することで「値」にアクセスすることができます。 (法人)光回線 はUCOM光 business.fttx.co.jp 約40,000件の採用実績/貴社 の課題 に応じた最適なプラン をご提案! %fruit = ("red" => "apple", "yellow" => "banana", "purple" => "grape"); print "$fruit{'red'}¥n"; > apple ちなみに、「キー」の文字列が全て「英数字・アンダースコア」の場合には、クォーテーションによる括りを省略 しても構いません。 ちょっとしたことですが、結構便利です。 # キーのクォーテーションを省略した例-1 %fruit = (red => "apple", yellow => "banana", purple => "grape"); # キーのクォーテーションを省略した例-2 print "$fruit{red}¥n"; 4-3. ハッシュ関数 ハッシュを操作するための関数として、次のような関数が用意されています。 関数 内容 http://www.kent-web.com/perl/chap4.html[2014/08/02 11:03:09] 注目サイト 池袋 社労士 是正勧告への対応 W3C標準 Perl基礎入門 ¦ KentWeb keys すべてのキーを取り出す values すべての値を取り出す each 1組のキーと値を取り出す delete 特定の要素を取り除く 1. keys すべての「キー」を取り出します。 ただし、取り出された配列の順序は一定でないことに注意します。 これはハッシュが順序付けられた配列ではないため です。 %fruit = (red => "apple", yellow => "banana", purple => "grape"); @file = keys %fruit; print "@file¥n"; > purple yellow red 2. values すべての「値」を取り出します。 keys関数同様、取り出された配列の順序は一定ではありません。 %fruit = (red => "apple", yellow => "banana", purple => "grape"); @file = values %fruit; print "@file¥n"; > grape banana apple 3. each 1組の「キー」と「値」を取り出します。 %fruit = (red => "apple", yellow => "banana", purple => "grape"); ($key, $val) = each %fruit; print "$key : $val¥n"; > purple : grape しかしながら、上記の場合、どのペアが取り出されるかが不定であり、しかも1組だけが抽出されるので、通常each関 数の場合は次のようにwhile構文と併用した形で使用されます。 %fruit = (red => "apple", yellow => "banana", purple => "grape"); # ハッシュの全要素を展開 while ( my ($key, $val) = each %fruit ) { rint "$key : $val¥n"; } > purple : grape > yellow : banana > red : apple 4. delete 特定の要素を取り除きます。 変数によるキーを指定することで、そのキーと値のペアをハッシュから削除します。 %fruit = (red => "apple", yellow => "banana", purple => "grape"); # 要素を削除(yellow - banana の要素) delete $fruit{yellow}; # 残りの要素を全て展開 while ( my ($key, $val) = each %fruit ) { print "$key : $val¥n"; } http://www.kent-web.com/perl/chap4.html[2014/08/02 11:03:09] Perl基礎入門 ¦ KentWeb > purple : grape > red : apple ちなみに、上記のdelete関数は特定の要素を削除する場合ですが、全要素を削除する場合には、空リストを代入す ると、全要素が削除されます。 %fruit = (); ただし、上記の場合中身が空ですが、定義値のままです。 もし、未定義値にしたい場合には、undef関数を使用し ます。 undef %fruit; 4-4. ハッシュスライス 配列変数に対する場合と同様に、ハッシュのスライスを使用すれば、各要素の集合にアクセスすることができま す。 たとえば、次のようなメンバーの年齢データがあったとします。 %age = (tom => 21, mike => 19, kent => 25, nancy => 17); これをスライスを使うと、次のように記述できます。先頭が、%ではなく@であることに注意してください。 @age{ qw(tom mike kent nancy) } = (21,19,25,17); 以下に、コード例で見てみましょう。 tomとmikeが今月誕生日を迎えました。年齢を更新してみましょう。 use strict; # 年齢データ my %age = (tom => 21, mike => 19, kent => 25, nancy => 17); # tomとmikeを更新 @age{ qw(tom mike) } = (22,20); # データの中身を見る while ( my ($key, $val) = each %age ) { rint "$key : $val¥n"; } > nancy : 17 > kent : 25 > tom : 22 > mike : 20 また、スライスを使うことで、任意の要素の値をリストとして取り出すこともできます。 use strict; # 年齢データ my %age = (tom => 21, mike => 19, kent => 25, nancy => 17); # kentとnancyの年齢を取り出す my @data = @age{ qw(kent nancy) }; # リストの中身を見る print "@data¥n"; > 25 17 4-5. ハッシュを代入順に並べる ハッシュの配列は、順番どおりには並ばないことは前に述べました。 しかしながら、どうしてもキーや値を順番通りに取り出したい場合には、実はTie::IxHashモジュールを利用する ことで実現できます。 http://www.kent-web.com/perl/chap4.html[2014/08/02 11:03:09] Perl基礎入門 ¦ KentWeb 使い方によっては、大変便利なモジュールですので、ご紹介しておきます。 Tie::IxHashの使い方のポイントは、必ず対象のハッシュを呼び出す前に、tie関数で関連付けしておきます。 use strict; use Tie::IxHash; # %hashを関連付け tie ( my %hash, 'Tie::IxHash' ); # ハッシュに代入 %hash = ( Sun => 0, Mon => 1, Tue => 2, Wed => 3, ; # 全要素を展開 while( my ($key, $val) = each %hash ) { rint "$key : $val¥n"; } > Sun : 0 > Mon : 1 > Tue : 2 > Wed : 3 上記のように、全てのキーと値を代入順に取り出すことができます。 ちなみに、Tie::IxHashモジュールは標準モジュールではありませんので、各自でインストールする必要がありま す。 ただし、PurePerl(すべてPerl言語で書かれたもの)のため、Perlライブラリ(jcode.pl, cgi-lib.pl等)のよう に、ホームディレクトリの中に置いて使用することが可能です。 参考 : 【コラム】Perlモジュールの組み込み 4-6. 多次元ハッシュ ハッシュは、配列と同様に多次元に展開させることができます。ハッシュの中にハッシュを作ることができます。 以下のハッシュは、いわゆる二次元ハッシュになります。 %hash = ( => { a => 1, b => 2, c => 3 }, => { d => 4, e => 5, f => 6 }, ); 波括弧(ブレース)の部分を、1つのスカラーと読み替えると、分かりやすいかもしれません。 %hashにおいて、キー「A」に対する値の中の最初のキー「a」の値「1」にアクセスするには、添字を使用して 次のように記述することができます。 %hash = ( => { a => 1, b => 2, c => 3 }, => { d => 4, e => 5, f => 6 }, ); print "$hash{A}{a}¥n"; > 1 リファレンスを使って、キー「A」に対する値(配列)を展開するには、次のように記述します。 %hash = ( http://www.kent-web.com/perl/chap4.html[2014/08/02 11:03:09] Perl基礎入門 ¦ KentWeb => { a => 1, b => 2, c => 3 }, => { d => 4, e => 5, f => 6 }, ); while ( my ($key, $val) = each %{$hash{A}} ) { rint "$key : $val¥n"; } > c:3 > a:1 > b:2 %hashの中の全てのキーと値を展開するには、次のように記述します。 %hash = ( => { a => 1, b => 2, c => 3 }, => { d => 4, e => 5, f => 6 }, ); foreach my $tmp ( keys %hash ) { hile ( my ($key, $val) = each %{$hash{$tmp}} ) { print "$key : $val¥n"; } > c:3 > a:1 > b:2 > e:5 > d:4 > f:6 %hashに対して、二次元のキーと値をさらに追加してみましょう。 %hash = ( => { a => 1, b => 2, c => 3 }, => { d => 4, e => 5, f => 6 }, ); # キー「C」に対する二次元の値を追加 $hash{C} = { g => 7, h => 8, i => 9 }; while ( my ($key, $val) = each %{$hash{C}} ) { rint "$key : $val¥n"; } > h:8 > g:7 > i:9 特定のキーに対する値に、要素を追加してみましょう。 %hash = ( => { a => 1, b => 2, c => 3 }, => { d => 4, e => 5, f => 6 }, ); # キー「A」に対する値に要素追加 $hash{A}{x} = 7; while ( my ($key, $val) = each %{$hash{A}} ) { rint "$key : $val¥n"; } > c:3 > a:1 > b:2 http://www.kent-web.com/perl/chap4.html[2014/08/02 11:03:09] Perl基礎入門 ¦ KentWeb > x:7 0 1 2 3 4 5 6 7 8 9 | トップ | 新着情報 | 掲示板 | チャット | カウンタ | パスワード制限 | メールプログラム | データ収集 | 買物カート | バラエティ系 | ユーティリティ | | 利用規定 | サポートコーナ | よく頂く質問(FAQ) | 過去ログ検索 | ダウンロードランク | サイト内検索 | 書籍執筆 | KENTプロフ | 郵便番号検索 | | Perl基礎入門 | データベース入門 | 暗号入門 | 自宅マシンサーバ化 | 国旗検索&クイズ | favicon作成 | QRコード作成 | ページランクチェッカ | Copyright c KENT-WEB 1997-2014. http://www.kent-web.com/perl/chap4.html[2014/08/02 11:03:09]
© Copyright 2024 ExpyDoc