• ベストアンサー

Perlで二次配列は可能?

毎度御世話になっております。 Perlスクリプトで二次配列のような配列の使い方は可能でしょうか? (A*B)種類の変数を配列の形で操作したいと考えています。 A,B共に8~256ぐらいで、処理の途中で増やせる様にしたいのです。 連想配列を用いればそれらしいことが出来るのではないかと思ったのですが、 うまく行きません。どうかお知恵を御貸し下さい。

  • Perl
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

 Perlでは完全な2次元配列を定義する方法はありません。 代わりにリファレンスを使って、等価なデータ構造を実装できます。 例)4行5列の2次元配列  @array = (   ['A0'..'A4'],    # ['A0','A1','A2','A3','A4']と等価   ['B0'..'B4'],   ['C0'..'C4'],   ['D0'..'D4'],  ); このとき、$array[2][3]は'C3'です。  ただし@arrayは2次元配列ではなく、複数の1次元配列のリファレンスを要素に持つ1次元の配列なので、拡張する際には注意が必要です。 (誤った方法で拡張すると、行ごとに列数の異なる配列が出来てしまいます。) ■行要素の拡張  @arrayに追加する配列のリファレンスをpushします。  追加する配列の要素数は、2次元配列の列数と同じにします。  # 定数のリストを追加する場合   push @array, ['E0'..'E4'];  # 既存の配列@appendを追加する場合   push @array, [@append]; ■列要素の拡張  @arrayの全ての要素(それぞれが配列)に、要素を追加します。  # 列要素数を指定した値にする(大きくも小さくもできます)   $col = 8;    # 列数を8にする   foreach $row (@array) {    $#$row = $col-1;   }  # 既存の配列の値を新しい列として追加する   @cols = ('A5','B5','C5','D5','E5');   for (my $i=0; $i<=$#array; ++$i) {    push @{$array[$i]}, $cols[$i];   }  @arrayの全ての行の列数が一定になるように拡張しないと、2重ループなどによる配列処理が難しくなります。  2次元配列ではなく、リファレンス配列であるということに注意するようにしてください。

Atalia
質問者

お礼

大変詳しく解りやすい御説明ありがとうございます。 二次元配列の拡張はかなり手間がかかるのですね。

その他の回答 (1)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.1

PERL5では多次元配列一応使えますが、つかいにくいっすよね。(Printしにくいでござる) http://www02.u-page.so-net.ne.jp/ca2/denden/perl_k.htm このへんの記述ってすこしは参考になりますか?

Atalia
質問者

お礼

詳しい資料を御紹介頂きありがとう御座います。 手元の資料はPerl4について書かれているものばかりで、 多次元配列が使える事自体知りませんでした(^^;;

関連するQ&A

  • Perlのサブルーチンで連想配列(ハッシュ)を渡す

    Perlのサブルーチンで連想配列(ハッシュ)を渡す方法 -------------------------------------- $str=rep::replace(%A,$B,@C); -------------------------------------- sub refidrep ( \%\$\@ ){ my(%A,$B,@C)=(@_); } -------------------------------------- では、上手くいきませんでした。 どのようにしたら、連想配列をサブルーチンに渡せるのでしょうか? 分かる方いらっしゃいましたらご教授ください。

    • ベストアンサー
    • Perl
  • 配列や連想配列について

    言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlでの配列について

    配列の配列について教えてください。 以下のようなテキストから値を取得し、A,B,Cの値をそれぞれ別の配列に格納し、A,B,Cの平均値を出す処理を行っているとします。 ----- A=100 B=200 C=300 A=110 B=210 : ----- 現状、以下のような状態です。 @arrayA=(); @arrayB=(); @arrayC=(); : (テキストを読み込み) : ・読み込んだ行がA=XXXならarrayAにpush push(@arrayA,"100"); ・読み込んだっ行がB=XXXならarrayBにpush push(@arrayB,"100"); : (各配列の要素の平均値を出す) このやり方だと、グループが増えるとそのまま行数が増えて冗長なので、グループごとの配列を1つの配列にまとめたいのです。 Webで初期値を入れた形で説明しているのはよくみるのですが、今回のように空の配列に値をいれていくにはどうすればよいのでしょうか?(そもそも宣言の仕方もわかりません)。 また、配列の配列?とした場合、以下のような処理はできるのでしょうか? (1)配列の1つ目の要素(の配列)にpushする(現状でのarrayAにpushに該当) push(@arrayAll[0],"test");

  • 他スクリプトの連想配列を扱いたい

    a.phpにある特定の連想配列を、b.phpで扱いたいのですが どのようにすれば良いのでしょうか?? 簡略化して書きますが、a.phpに $a[japan][kantou][] = "東京"; $a[japan][kantou][] = "神奈川"; $a[japan][kantou][] = "千葉"; $a[japan][kansai][] = "大阪"; $a[japan][kansai][] = "兵庫"; $a[japan][kansai][] = "京都";    ・    ・    ・ (簡略化していますが実際はもっと複雑な連想配列です。) 上記のような連想配列があり、 b.phpで、$a[japan][kansai]の配列を扱いたいのです。 b.phpで、requireを使ってa.phpを読み込んでも a.php内の他の実行処理までされてしまうのでNG。 扱いたい連想配列をtxtなどに出力し、 b.phpでそのtxtを読み込んで扱う事も考えたのですが、わざわざ出力するのも・・・ なのでNG。 globalで、他スクリプトの特定の連想配列を読み込む事はできないですよね・・・? 何かいい方法があればご教授頂けたらと思います。

    • ベストアンサー
    • PHP
  • 連想配列の初期化

    UNIXでAWKの連想配列を使っています。 連想配列を処理の途中で初期化したいのですが、どうすれば良いのでしょう? とりあえず今は以下のように初期化をしています。 for ( i in a ){a[i]="";} しかし、できれば a=null という感じに一発で初期化をしたいのです。

  • if と配列の組み合わせ

    なにやら思いつかなかったのでこちらで相談します。 配列のaと変数bがこんな感じだったとします。 int a[4]={1,3,4,7}; b=6; もしbが配列aのどの数字にも当てはまらないならこうしますよ もしbが配列aのどれかの数字に当てはまるならこうしますよ といったプログラムを作りたいのですが短く処理できる プログラムを思いつきません。(理論演算子を使えば長くなる) どうすれば短く処理できますか?

  • Perl 文字列を配列に直す方法

    こんにちは。 今Perlをやっているのですが、変わった文字列を配列に上手く入れて、配列を操作するところで行き詰っています。 例として、 windows95 windows98 windows2000 windowsXP windowsVista このように並んだものを、配列に入れて処理を行いたいです。 ただコレを$wordsに入れて$words = @wordsとしても、その後の処理に詰まってしまいます。 その後の処理コード自体は使えるものなので、配列の入れ方に問題があると思っているのですが、私の中で答えを導くことはまだ出来ていません(汗 解決方法または良いやり方があれば、是非教えていただきたいです。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 【Perl】サブルーチンから多次元配列を戻したい

    【Perl】サブルーチンから多次元配列を戻したい サブルーチン内で作った2次元配列と1つの変数(例:@listと$i)をリターンしたいのですが、どのようにすれば良いでしょうか? ↓サブルーチン(calc) return (@list, $i); ↓メイン my $a = 12; my (@list, $i) = &calc($a); 間違っていると思いますが、現時点でのプログラムを一部書きました。 ご回答よろしくお願いします!

    • ベストアンサー
    • Perl
  • 二つの配列から連想配列を作る方法

    @Aと@Bという二つの配列があり、そこから %C = ( "$A[0]" => "$B[0]", "$A[1]" => "$B[1]", "$A[2]" => "$B[2]", ・ ・ ・ ); という連想配列を作ることは出来ますでしょうか。 @Aと@Bは変動するので%Cは自動的に作成したいのです。 宜しく願い致します。

    • ベストアンサー
    • Perl
  • PHPで配列の最も小さいもの3つを取り出す方法

    PHPで配列のソートが出来ずに困っています 今 $a[2]=10 $a[10]=2 $a[3]=30 $a[22]=20 $a[9]=4 $a[53]=29 ・ ・ ・ のような配列があり、これを配列の値の小さいものから順に3つ取り出したいのですが、どの様にしたらよいでしょうか? 具体的には $a[10],$a[9],$a[2] という形で取り出したいです 最終的にはそれぞれの添え字を他の変数に代入した形にしたいです $b[1] = '10'; $b[2] = '9'; $b[3] = '2'; みたいなかんじです どなたかご解答いただければと思います どうぞよろしくお願いいたします

    • ベストアンサー
    • PHP

専門家に質問してみよう