• ベストアンサー

たくさんの配列を簡単に操作したい。

配列の要素を出力したいのですが、 @name_1 @name_2 @name_3 @name_4 print "@name_1\n@name_2\n@name_3\n@name_4\n"; としてるのですが、配列が100個あったとき書ききれません。 このような処理を簡単に書ける方法はないでしょうか? ニュアンスとしては以下のような感じです。 for($n=0;$n<100;$n++){ print "@name_$n\n"; } ご教授おねがいします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

現在のやり方だと、配列の数を倍にしたい、10倍にしたい、というときにどうするのでしょうか?その数だけコードを書かなければなりません。 配列の名前を増やすことで配列を増やす、という考え方だとこんな問題がでます。 通常、プログラミングでは、これも配列として扱います。多次元配列というやつです。 perl5なら次のように書けます。 my @arr; 配列に無名配列の参照を代入 $arr[0] = [100,200,300]; $arr[1] = [101,201,301]; あるいは配列要素に直接代入 $arr[0]->[0] = 100; $arr[0]->[1] = 200; $arr[0]->[2] = 300; $arr[1]->[0] = 101; $arr[1]->[1] = 201; $arr[1]->[2] = 301; これらはすべて、配列の要素に配列の参照を設定しています。 perlではあらかじめ配列のサイズの宣言をしなくてよく、添え字も飛び飛び でもいいので扱いが楽です。配列@arrなら、いきなり$arr[n]='abc';代入すれば n番目のメンバを持つ配列ができあがります。 ハッシュのメンバ指定と配列のメンバ指定の間の->演算子は省略できるため $hash{key}->[100]->{key2}などは$hash{key}[100]{key2}と書けます。 上はすべて、 $arr[0][0] = 100; のように書けます。 perl5に多次元配列はありませんが、上のようなやり方で実質、多次元配列と同等 の扱いができるようになります。 どうしても今のやり方でやりたいのなら、 @name_0からあるとして、 for($n=0;$n<100;$n++){ eval qq{print "\@name_$n\\n";}; }

FUCKIE
質問者

お礼

回答ありがとうございました。 eval qq{print "\@name_$n\\n";}; こんな書き方もあったんですね。 また、いままで、多次元配列は使ったこと無かったので、 非常に参考になりました。 どうもありがとうございました。

関連するQ&A

  • 配列をPOSTで受けとる

    タイトルのまんまですが 配列をformで送って それをPOSTで受け取りたいのですが うまくいきません 具体的に言うと <?php print"<form method=POST action=action.php>"; for($i=0; $i<$n; $i++){    print"<input type=text name=foo[$i]>"; } print"<input type=hidden name=n value=$n>"; print"<input type=submit value=go>"; print"<form>"; ?> ///////////以下action.php////////////////// <?php $n = $_POST["n"]; for($j=0; $j<$n; $j++){    $foo[$j] = $_POST["foo[$j]"];    print"$foo[$j]"; } ?> こんな感じのことがしたいのですが うまくいきません どうもPOSTされてないみたいでfoo[$j]はnullです 凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓ 教えてください よろしくお願いします

    • ベストアンサー
    • PHP
  • 連想配列とforeach

    連想配列 %hogeにおいて、.name の名前が最後に付く配列の値を取り出したいと思い、下記のようにしました。 foreach ($hoge{/.*\.name$/}) {  print "$_\n"; } としてみましたが期待した出力がされませんでした。こういう描き方って出来ないんでしょうか?それともどこか間違ってますか?

    • ベストアンサー
    • Perl
  • データの配列

    POSTで送られたデータから配列を作りたいのです。 下記はPOSTのデータをprint_r($_POST)で全て表示していますが、 この中から[NO0~11]までを array([0]=>11 [1]=>6 ~)というような形で配列として表示したので すが、方法が分かりません。 Array ( [N00] => 11 [NAME0] => a [N01] => 6 [NAME1] => b [N02] => 9 [NAME2] => c [N03] => 3 [NAME3] => d [N04] => 12 [NAME4] => e [N05] => 10 [NAME5] => f [N06] => 1 [NAME6] => g [N07] => 5 [NAME7] => h [N08] => 2 [NAME8] => i [N09] => 7 [NAME9] => j [N010] => 4 [NAME10] => k [N011] => 8 [NAME11] => l)

    • 締切済み
    • PHP
  • 配列の問題

    配列の問題です。 n個の要素を持つ一次元配列の値(変数値)をまったく逆に入れ替えるプログラムを作りたいのですが、この場合どのようにして逆を表現すればよいのかわかりません。 (nの値は読み込み、配列は奇数個でも偶数個でも使えるプログラムでなければなりません) 参考書を見ながら作ってみたのですが…だめでした。 プログラム初心者です。アドバイスお願いします。 int main(void) { int i,n; int vc[n]; printf("n個の要素を持つ一次元配列をつくる\n"); printf("nの値を入力してください\n"); scanf("%d",&n); for (i=0;i<n+1;i++) vc[i]=i+1; for (i=0;i<5;i++) printf("vc[%d]=%d\n",i,vc[i]); printf("この配列を逆に入れ替えると\n); return 0; }

  • 無名配列にスライスを使いたい。

    無名配列の要素へアクセスする際に、スライスを使いたいのですが どのようにすれば良いのでしょうか? まず、@table を3行×3列のテーブルにみたてて、テーブルを作成します。 my @table; for my $i (0..2){ for my $j (0..2){ $table[$i][$j] = ($i+1)*($j+1); } } foreach (@table){ print "@{$_}\n"; } # 出力結果 # 1 2 3 # 2 4 6 # 3 6 9 # 次に1列目のデータをすべて x にしたいのですが、以下のようにすればできることは理解できました。 foreach my $k (0..2){ $table[$k][0] = x; } # output # x 2 3 # x 4 6 # x 6 9 # ただ、これを以下のようにスライスを使って処理しようとすると・・・ ${@table[0..2]}[0] = x; foreach (@table){ print "@{$_}\n"; } # 出力結果 # 1 2 3 # 2 4 6 # x 6 9 # 明らかに目的とは違ったスクリプトになってしまっているのですが、なぜ上記のような出力になるのでしょうか? また、スライスを使って、一行目のデータをすべてxにする方法が ありましたらご指導くださいませんでしょうか。 長い質問になってしまいましたが、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 配列

    適当な記述ですが、次を見てください。 void roll(int *c) { int n, b2[8]; if(t<3) { for(n=0; n<8; n++) b2[n]=c[n]; for(n=0; n<8; n++) c[b2[n]]=7-n; for(n=0; n<8; n++) printf("%d",c[n]); printf("\n"); t++; roll(c); } else t=0; } int main() { int b[]={3,6,4,0,7,2,5,1}; roll(b); for(n=0; n<8; n++) printf("%d",b[n]); //36407251が表示されるようにしたい。 return(0); } rollが何の関数かは省略しますが、rollにmainのb(ポインタ?)を渡し、ある処理をして,それでmainに戻ってきた時にb[]を表示すると、36407251が表示されません。 ポインタを引数にするってことはポインタでさしてるとこをrollで操作してるわけですよね? そうすれば変わって当然だとはおもいます。 でも関数1で関数2に配列1を渡し、その関数2の中でで配列1の値が変化しても、元の関数1にもどれば配列1のまま変化していないようにするにはどうすればいいですか? やはり もう1つ配列を用意しなきゃだめなのでしょうか。

  • 要らない配列を無くしたい。Perl

    要素のない配列を消したいです。 do\n be\n usual\n become\n get\n look\n watch\n このような複数行の文があり"a"が入っている行だけ配列に突っ込みたいと思っています。 自分が試した方法として。 @line = split(/\n/,$content); とりあえず改行で区切り配列にぶち込んでいき。 foreach $line (@line){       unless ($line =~/a/){       $line = undef; } } その次に"a"が入っている以外の配列にundefを入れるようにしていました。 しかしこれだとundefが入っている配列がたくさん出来てしまい納得がいきません。 要素のない配列を消したいです。 どなたかご教授お願いします。

    • ベストアンサー
    • Perl
  • 配列の頭に要素を挿入する方法

    初心者です。配列でご教授お願いします。 インデックス0からひとつずつ要素をずらして、配列の一番前に要素を挿入するにはどうしたらいいのでしょうか? int[] a = new int[10]; int n = a.length; for (int i = n-1; i < 1; i--){ a[i] = a[i-1]; } a[0] = 新しい要素 といった感じで書いたのですが、どうもループの中が実行されていないようなのです。 よろしくお願いいたします。

  • MATLABで配列をファイルへ書き込む方法

    現在MATLABについて勉強しているのですが、配列M(N×N、Nは任意)をファイル(.txtなど)に書き込む方法が分からず困っています。 fid=fopen('matrix.txt','wt'); fprintf(fid,'%6.4f',M); fclose(fid); このように書いているのですが、全要素が1行に並んでしまいます。 N行N列の形で配列をファイルに出力したいのです。 どなたか初心者でも理解できるようご教授お願い致します。

  • 拡張for文について質問

    以下は、拡張for文と配列に関するソースコードの一部を抜粋したものです。 それを見た上で、私の質問に答えてください。 int[]a={10,5,8,4,3}; for(int n:a){ System.out.print(n+" "); } int[][]a={{1,2},{4,5,6}}; for(int[]n:a){ for(int k:n){ System.out.print(k+" "); } System.out.println(""); } 質問1:何故、前者の配列は、『for(int n:a)』のように[]がついてなくても配列要素が取り出せるのに、後者の多次元配列は『for(int[]n:a){』のように『[]』がついた拡張for文を書いた上で、下にも拡張for文を書いた2重構造でないと配列要素を取り出せないのですか? 後者について『for(int n:a){』の文だけで多次元配列aの要素全て取り出せると思ってました。 因みに、配列変数には配列要素が入ってるのではなくて「参照」が入ってるのはわかってます。 このことと、何か関係があるのか、、?

    • ベストアンサー
    • Java

専門家に質問してみよう