• ベストアンサー

Perlの初歩的な質問・・・

@data に大量のデータが格納されていると仮定して、次のようにループ処理するとします・・・ for($i = 0 ; $i < @data ; ++$i){ @XXX = split(/\t/, $data[$i]); } このように @data のデータをさらに細かく配列化して @XXX に代入したいのですが、ループのたびに @XXX の名前を XXX0 , XXX1 , XXX2..... とするには、どうしたらよいのでしょうか。

  • pouta
  • お礼率72% (61/84)
  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • damejan
  • ベストアンサー率30% (58/192)
回答No.1

for($i = 0 ; $i < @data ; ++$i){ @{"XXX$i"} = split(/\t/, $data[$i]); } とやれば、できるけど・・・。 ちなみに、なんで独立した変数に@dataの各要素を入れたいの? $data[$i]をそのまま使えばいいんじゃない。$data[$i]の各要素が必要な度にsplitして使えばいいと思うんだけど。同じ内容のデータを@dataと@XXX0,@XXX1...で2つ持つのも非効率だし、参照も面倒だし、あまり嬉しいいことないから、私だったら、こういった変数の使い方はしないな。

その他の回答 (2)

  • tancoro
  • ベストアンサー率52% (11/21)
回答No.3

無名配列をうまく使えばいいのではないでしょうか? @data = map { [split(/\t/,$_)] } @data; 例えばこんな風にすれば、@dataの各要素を \t で分割し、それを無名配列とする。さらに、その無名配列を要素とする@dataを再構築する。 $data[x]->[y] で、データへのアクセスができます。

pouta
質問者

お礼

こんなに早く答えていただけるとは思っていませんでした。 どの回答もばっちりなので皆さんにポイントを発行したいのですが、無理なようなので早い人順にします。 tancoro ごめんなさい。 皆さんありがとうございました。

pouta
質問者

補足

tancoro => tancoro さん 失礼しました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

通常は配列を使うのでは。 こんな感じ: for( my $i = 0 ; $i <= $#data ; $i++ ){ $XXX[$i] = [ split( /\t/, $data[$i] ) ]; } print $XXX[0]->[0], "\n"; 詳しくは、Perl付属ドキュメントperlref/perldata/perlfaq4あたりをごらんになってみては。

関連するQ&A

  • 配列入れ替えの効率的方法は

    VBでグローバル変数配列を3000とっています。 格納されているデータを、1つづつずらして代入し直しをやりたいのですが 配列添え字1のデータを配列添え字0にというふうに3000回のループで 処理する以外に良い方法はないでしょうか 例 for i=0 to 2999 a[i]=a[i+1]

  • [arduino]数値の大きなデータを二次配列へ

    シリアル通信で得たデータを二次元配列へ格納するために、 以前では、 if(Serial.available()>120){ for(int k=0;k<8;k++){ for(int l=0;l<15;l++){ //読み込んだ値を配列に代入 matrix[k][l]=Serial.read(); } } } このようなやり方で読み込んだ値を二次元配列に代入していたのですが、 128個以上のデータを扱いたい場合、Serial.availableでは保持できず、困っています。 方法として、 (1)一つずつデータを読み込み、128回ループを繰り返し配列に貯めていく。その後配列を2次元配列に代入する。 (2)一つデータを読みこんだら二次元配列の1行目1列目のドットに格納、もう一つデータを読みこんだら二次元配列の1行目2列目のドットに格納…というように、 読みこんだデータをそのまま二次元配列のそれぞれの場所へ格納していく。 というような二つの方法を思いついたのですが、 (1)の方法では、配列にデータを貯蓄していくコードをこのように↓書いたのですがうまくいかず、 for(int i=0;i<128;i++){ if(Serial.available()>0){ data[128] = Serial.read(); } } (2)の方法では、データを二次元配列のそれぞれの場所へ格納していく指定方法が分かりませんでした。 正しい書き方や、良いアイデアをお持ちの方がいましたら、是非御教授お願いします。

  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • csvファイルを2次元配列に格納

    Javaの勉強をしています。 csvファイルを読み込んで2次元配列に格納する方法を教えて下さい。 1次元の配列なら下記のようにして出来たのですが、2次元の配列に格納する方法が分かりません。 ------------------------------ try { File csv = new File("xxx.csv"); BufferedReader brf = new BufferedReader(new FileReader(csv)); while(brf.ready()) { String line = brf.readLine(); String[] data = line.split(","); for(int j=0; j<data.length; j++) { System.out.print(data[j] + "\t"); } System.out.println(); } brf.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } --------------------------- 一度はできないのかと思い、上記の1次元配列のdata[j]を2次元配列のarray[i][j]に代入してみたのですが出来ませんでした。 回答宜しくお願い致します。

    • ベストアンサー
    • Java
  • Excel(VBA)で配列の要素数を調べるには?

    お世話になります。 ExcelのVBAで、split関数を使って配列に格納したデータの要素数を調べる方法がわかりません。 下記のようなコードで、読み込んだデータを配列(Arraydata)に格納することは出来たのですが、test.csvの要素数が処理の度に変わるため、要素数に応じて後続の処理を行ないたいと考えています。 Open test.csv For Input As #1 ' test.csvファイルを開く Line Input #1, test.csv ' データ行を読み込む Arraydata = Array(Split(test.csv, ",")) ' 配列に格納 よろしくお願いします。

  • C# 配列の配列(多次元配列?)

    C#において、配列の配列中に格納した値を、検索することを 行いたいのですが、格納した値そのものを見ることができません。 まだ、C#を始めて間もないので、配列に格納する時点で、 不備があるかも知れませんが、お願いします。 やりたいこと ・テキストファイル内にある値を、2次元配列または、多次元配列に格納 ・配列に格納した値で、データチェックなどを行う予定  テキストファイル内のデータは、下記内容となり要素数も固定ではなく変動する   A=1,2,3・・・   B=11,22,33・・・ 実際のソースは、 //配列 ArrayList list = new ArrayList(); //配列格納 1レコード毎用 ArrayList listtmp = new ArrayList(); while ((strGenderTextLine = objReader.ReadLine()) != null) {  string strBuffer;  //「=」前の値格納用変数  string[] strBuffer2; //「=」後の値格納用配列  listtmp=null;  //strtmpに「=」前の値を格納  strtmp = TextLine.Split('=').GetValue(0).ToString();  //strtmp2に「=」後の値を格納(配列)  strtmp2 = TextLine.Split('=').GetValue(1).ToString().Split(',');  for (int i = 0; i <= strtmp2.Length - 1; i ++)  {   //[i,0]に、「=」前の値を代入   if (i == 0)   {   listtmp.Add(strtmp);   }   else   {   listtmp.Add(strtmp2[i].ToString());   }  }  //list配列にlistTmp配列を格納(配列の配列)  list.Add(listtmp);  intT = intT + strtmp2.Length;  //行数カウント  intTLine = intTLine + 1;  } ここから、配列「list」内に入っている値を閲覧することができる方法を教えていただければと思います。 宜しくお願いいたします。

  • perlでの三次元配列の作り方

    perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合 foreach $line (@input) push @data, [split /[:]/, $line]; で@dataが二次元配列になるのですが、三次元配列の場合このあとに push @output, \@data; とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。 解決法はありますでしょうか?

  • 配列長参照のオーバーヘッド

    for等ループでループ終了条件に配列長を使用する場合、配列長を毎回参照する場合と一旦変数に格納して参照する場合、定数を使用する場合と処理速度の差はありますか? つまり 1、for( int i = 0; i < array.length; i++ ) { ... } 2、for( int i = 0; i < len; i++ ) { ... } *(int len=array.length) 3、for( int i = 0; i < 10; i++ ) { ... } *(int[] array = new int[10]) forループ内の処理のメモリ使用量の多寡は不明で、毎ループで読み取られる全ての変数はコンピュータのキャッシュに残るかどうかは不明だとします。

    • ベストアンサー
    • Java
  • データコピー

    unsigned short型の配列から別のunsigned short型の配列へ、データをコピーするときに、オーバーヘッドを少なく、いかに処理時間を高速にデータをコピーするかというお話です。 たとえば↓のようなデータがあったとします。 unsigned short a[100],b[100]; 配列aから配列bへどのようにしたら、高速にメモリコピーできるんでしょうか? memcopyを使用すると一番手っ取り早いのですが、ものすごくオーバーヘッドが高いと聞きます。memcopyを行うとどのような処理をしているのでしょうか? memcpyを使用しないなら、for文を使って for(i=0;i<100;i++){  a[i]=b[i]; } と私はしてしまいたいのですが、知人曰く、メモリアクセスには時間がかかるので避けたいとのことでした。 たとえば、aからbへの代入に一旦ポインタを使用して、double型でキャストして代入を行い、メモリアクセスの回数を減らして、for文のループも減らすという対策も出来るとおもいますが、一体どれが一番高速にaからbへデータをコピーできるのでしょうか? a[100],b[100]としましたが、サイズは任意です。大きい場合もあるし、小さい場合もあります。 なにか良いアイデア&memcopyの内部処理などを知っている方いましたら、教えてください。

専門家に質問してみよう