• ベストアンサー

2次元配列がわかりやすく記述されたおすすめの書籍はありませんか?

こんばんは、皆さん。 2次元配列がわかりやすく説明されているおすすめの本はありませんか? リファレンスも怪しいので、そこから丁寧に解説されていて、 2次元配列を中心に、多次元配列にも触れられている本を探しています。 私の技術レベルを持っている本で表すと以下のとおりです。 ・Perlの絵本(一通り理解しました) ・技術評論社のすぐわかるPerl(一通り理解しました) ・ASCII社のPerl/CGIスクリプト入門(CGIの前までは理解しました) これらの本には2次元配列については触れられておらず、 まだ自分には早いのかとも思いましたが、必要に迫られています。 アマゾンの評価は、具体的にこの項目についてはどうだといった情報が載っていないため、参考にできませんでした。 権威ある分厚い本は、持っている本を完全に理解してからにしようと思っています。 Perlの絵本くらいわかりやすく図解されているとありがたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kapura
  • ベストアンサー率50% (48/95)
回答No.5

# 間違いがあるかもしれませんが、私の理解しているところを書きます http://perldoc.jp/docs/perl/5.6.1/perllol.pod http://www.kt.rim.or.jp/~kbk/perl5.005/perllol.html 標準では2次元配列などというものはPerlに組み込まれてなくて、Perlの配列はそういう言い方をすればスカラーを要素とする1次元配列しかないところを認識するのがポイントだと思います。多次元の配列やハッシュというか多重構造の (ネストした) 配列やハッシュは、リファレンスというスカラーを要素とさせることで実現します。 例えば、2次元配列の例で言えば ┌               ┐ │ a_{00} a_{01} … a_{0n} │ │ a_{10} a_{11} … a_{1n} │ │ a_{20} a_{21} … a_{2n} │ │  .   . .   .  │ │  .   .  .  .  │ │  .   .   . .  │ │ a_{m0} a_{m1} … a_{mn} │ └               ┘ を実現するのに @array_2d = (@row_0, @row_1, @row_2, ..., @row_m) とか、あるいは # ただし、@row_i = ($a_i0, $a_i1, $a_i2, ..., $a_in) (i = 0, 1, 2, ..., m) @array_2d = ( ($a_00, $a_01, $a_02, ..., $a_0n), ($a_10, $a_11, $a_12, ..., $a_1n), ($a_20, $a_21, $a_22, ..., $a_2n), ..., ($a_m0, $a_m1, $a_m2, ..., $a_mn)) と書いてしまうと、@array_2dは期待した2次元配列とはならず、1次元に平坦化されて @array_2d = ( $a_00, $a_01, $a_02, ..., $a_0n, $a_10, $a_11, $a_12, ..., $a_1n, $a_20, $a_21, $a_22, ..., $a_2n, ..., $a_m0, $a_m1, $a_m2, ..., $a_mn) としたことと同じになってしまいます。これでは$a_ijを取り出すのにiとjを単純に並べて$array_2d[i,j]みたいにはできません ($array_2d[n*i+j]かな)。 これを解決するのがリファレンスで、配列を指すリファレンスを要素にして @array_2d = (\@raw_0, \@raw_1, \@row_2, ..., \@row_m) とか、あるいは @array_2d = ( [$a_00, $a_01, $a_02, ..., $a_0n], [$a_10, $a_11, $a_12, ..., $a_1n], [$a_20, $a_21, $a_22, ..., $a_2n], ..., [$a_m0, $a_m1, $a_m2, ..., $a_mn]) のようにすると期待したものになります。リファレンスはスカラーの一種なのでそのまま保たれます (角括弧は取り除かれない)。この場合、$a_ijの取り出しは、@array_2dのi要素 (i行要素全体@row_iを指すリファレンス) を使って、配列@{$array_2d[i]}のj要素とすることで実現できます。つまり${$array_2d[i]}[j]で指定できます。これは別の表記ができて、$array_2d[i]->[j]、さらに略記できて、$array_2d[i][j]と表すことができます (このように書くとあたかも他のプログラミング言語にあるような2次元配列に見えます)。 http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html 2次元配列は配列のリファレンスを要素とする配列というわけですが、以上のことを理解していれば「のリファレンス」といった部分を省略して、配列を要素とする配列、さらに略して配列の配列などと言っても十分伝わるわけです (配列が配列の要素になっているように聞こえて、他のプログラミング言語を学んでいる人だと文字通り受け取ってしまいがちですが、面倒なので省略した言い方をしているのだと認識するのが正しいわけです)。 書籍としては『続・初めてのPerl』の最初の数章を読むのがいいかもしれません。『Perlデータマンジング』の付録Bもいいかも。 http://www.oreilly.co.jp/books/4873111676/

noname#17299
質問者

補足

お返事ありがとうございます。 かなりわかってきました。 ただ、参考URLは私には難解なもののように思いました。 例えば、冒頭の文章からすでにわかりません。 「リリース 5以前のPerlではすべてのリファレンスはシンボリックでなければならなかったために」 のリファレンスはシンボリックと言う意味がいきなり不明です。 こんなレベルですが、「続・初めてのPerl」の前に「初めてのPerl」は読まなくて大丈夫でしょうか?

その他の回答 (5)

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.6

「続・初めてのPerl」は「初めてのPerl」を読み終えているのを前提としています。また、前半部分はよいのですが、オブジェクト指向に言及する部分以降の訳に難があります。値段も高価な上に、ご希望と違って図はほとんどありません。そんなこともあって今回はお薦めしませんでした。 シンボリックリファレンスとは、以下のような使い方です。use strict 下では使用できません。 $name = "test"; $test = "テスト"; print ${$name}; # print $test;と同じ結果になる # 結果↓ テスト

noname#17299
質問者

お礼

ありがとうございます。 変数を変数名にするのはシンボリックリファレンスという名称なんですね。 やはり初めてのPerlも読んだほうが良さそうに思いました。 あと、No.5の方ということでよろしいですね? ポイントの割り当てはNo.5に対してだけでご了承ください。

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.4

ハッシュを使って2次元配列もどきにしてしまうというのも一つの手かもしれません。 my %hash = ( "01" => 1, "02" => 2, "11" => 3, "12" => 4, "21" => 5, "22" => 6, ); # $hash{"$first$second"}でアクセスする。

noname#17299
質問者

お礼

ありがとうございます。 項目の少ない簡単な2次元配列ならそれで十分対応できますね。 必要に応じて参考にします。

回答No.3

No1です。 さっきのURLどうやらJAVAっぽいですね。 代わりのURL貼っておきます。 すいませんでした。

参考URL:
http://www001.upp.so-net.ne.jp/hata/dowasure_perl.html
noname#17299
質問者

お礼

お返事ありがとうございます。 Perlはやはりちょっとしたものを作るための、お手軽プログラム言語なんでしょうか? ネットでこと足りてしまう程度のものというのは、Perlを中心に勉強して行こうとしてるので、ちょっと残念です。 私はプログラミングのセンスがないせいか、ネットの文章を読んで身につける能力がほとんどありません。 ですので、申し訳ありませんが今回はポイントを見送らせていただきます。

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

多次元配列 = 配列の配列[の配列...] です。 普通の一次元の配列さえしっかり身についていれば後は応用でしかないのですが、Perlで扱う(コーディングする)には記号類(@,[],etc)の扱いにちょっと慣れがいるかもしれませんね。 とりあえず書籍としては『プログラミングPerl(通称らくだ本)』がおすすめですが、#1さんのおっしゃる通りネット上でも事足りるかと思います。 深く掘り下げてはありませんがポイントはしっかり押さえられていると思う参考URLを挙げておきます。

参考URL:
http://www.rfs.jp/sb/perl/02/04.html#%E5%A4%9A%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%E3%82%92%E9%9D%99%E7%9A%84%E3%81%AB%E
noname#17299
質問者

お礼

お返事ありがとうございます。 教えていただいたURLはごくたまに見ます。 多次元配列が書いてあるのは気づきませんでした。 でもリファレンスを使ってメモリの中身を意識したサンプルだとさらによかったです。 まずはURLに記載されている内容のことを自分のものにします。

回答No.1

Cとかベーシックなら分かるんですが、perlはネットで勉強しました。 なので、中途半端に覚えたのですが、タブンそのぐらいならばネットで調べるだけで分かる範囲だとおもいます。 URL乗せておきます。 具体的な考え方は 1次元配列とは1列の表の中にデータを書きこむ配列です。定規の目盛りのような感じですね。 2次元配列とは沢山の列の表にデータを書きこむ配列です。エクセルのような感じ 3次元配列とは縦、横、高さのある表にデータを書き込む配列です。エクセルのページが沢山ある様な感じです。 そんなに難しく考えなくても出来ると思うのですが。 考え方としては、hairetu[x][y]とは、x、yの座標にデータをしまった 位に覚えておけば良いと思います。

参考URL:
http://takeoba.cool.ne.jp/java/arrangement2.htm

関連するQ&A