ランダムに選んだファイル10個の内容を、配列の配列に記憶するため、次のようなプログラムを書いています。
ほとんど同じ内容を10回繰り返し書いているので、非常に見づらいと感じています。
for文などを使って、すっきりさせたいのですが、配列の配列やリファレンスの扱い方がわからず、うまくできません。
すっきりさせる書き方があれば教えてください。
配列の配列(下記例では@DataArray)のデータ構造や形式は元の形でなくてもかまいません。
配列の配列である必要もありません。
よろしくお願いします。
$r = int(rand(@FileNameArray));
$FileName = $FileNameArray[$r];
open( DATA_01_H, $FileName );
@Data01 = <DATA_01_H>;
close DATA_01_H;
push @DataArray, \@Data01;
: :
(02~09まで繰り返し)
: :
$r = int(rand(@FileNameArray));
$FileName = $FileNameArray[$r];
open( DATA_10_H, $FileName );
@Data01 = <DATA_10_H>;
close DATA_10_H;
push @DataArray, \@Data10;
foreach構文を使って、0から9の繰り返し(1..10でもいいですが…)でループを回し、@DataArray配列の中に配列としてデータを収めるというので如何でしょうか。
my @DataArray; foreach (0..9) { my $r = int(rand(@FileNameArray)); my $FileName = $FileNameArray[$r]; open( DAT, $FileName ); my @Data = <DAT>; close DAT; push (@DataArray, \@Data); }
希望の構造があれば、またコメントでもしようかと思います。
foreach構文を使って、0から9の繰り返し(1..10でもいいですが…)でループを回し、@DataArray配列の中に配列としてデータを収めるというので如何でしょうか。
my @DataArray; foreach (0..9) { my $r = int(rand(@FileNameArray)); my $FileName = $FileNameArray[$r]; open( DAT, $FileName ); my @Data = <DAT>; close DAT; push (@DataArray, \@Data); }
希望の構造があれば、またコメントでもしようかと思います。
回答ありがとうございます。
これでいけるのなら、完璧に私の希望通りです。
素人な質問で申し訳ないのですが、この場合 @Dataを使い回すことで内容が上書きされないのでしょうか?
リファレンスは、Cで言うポインタのようなものと解説されていたので、@Dataを使い回すと同じメモリ領域にデータが上書きされてしまうのではないかと心配していました。
あるいは、毎度
my @Data = <DAT>;
と my宣言することで、毎度違うデータ領域が取られているのでしょうか?
もしよければ、この質問にも再度お答え頂けないでしょうか?
追加質問なので、コメントではなく回答で返信いただけるとありがたいです。
あつかましいですが、よろしくお願いします。
【追記】
メモリ領域が云々というのがめんどくさければ、「とにかくこれで上書きされずにちゃんと動くよ」という回答でもOKです。
よろしくお願いします。
【再追記】
追加質問の方は、haruo-31さん、iu43lkjds32さんがコメント欄で答えてくださいました。
私の知りたいことが全部解決したので、質問を終了させて頂きます。
ありがとうございました。m(_"_)m
@Data01から@Data10を別に使うのでなければ,以下のように書き換えていけます。
1.
@Data01から@Data10を全て @Data00 に,
DATA_01_H から DATA_10_H を全て DATA_00_H に書き換える
2.
上記の書き換えたプログラムは10回同じことを繰り返しているので,
for で10回まわすように書き換えられる
同じファイルハンドルと配列を使い回しても大丈夫なはずです。
回答ありがとうございます。
私もファイルハンドルや配列を使い回すことを考えていたのですが、リファレンスを使って配列の配列を作る際、配列のメモリ領域が上書きされてしまうのではないかと心配だったのです。
今回は何がしたいのか、ちょっと分からなかった&酔ってるので、
こんな感じでヒントになるでしょうか。
Perlは多次元配列について、勝手に配列を作って関連付けてくれます。
use strict; use warnings; my @array; foreach my $a ( 0 .. 9 ) { foreach my $b ( 0 .. 9 ) { $array[$a][$b]=$a.$b; } } map { print join(",",@{$_})."\n"; } @array;
ありがとうございます。
コメント欄でも丁寧かつ親切な回答を頂き、ありがとうございます。
m(_"_)m
回答ありがとうございます。
これでいけるのなら、完璧に私の希望通りです。
素人な質問で申し訳ないのですが、この場合 @Dataを使い回すことで内容が上書きされないのでしょうか?
リファレンスは、Cで言うポインタのようなものと解説されていたので、@Dataを使い回すと同じメモリ領域にデータが上書きされてしまうのではないかと心配していました。
あるいは、毎度
my @Data = <DAT>;
と my宣言することで、毎度違うデータ領域が取られているのでしょうか?
もしよければ、この質問にも再度お答え頂けないでしょうか?
追加質問なので、コメントではなく回答で返信いただけるとありがたいです。
あつかましいですが、よろしくお願いします。
【追記】
メモリ領域が云々というのがめんどくさければ、「とにかくこれで上書きされずにちゃんと動くよ」という回答でもOKです。
よろしくお願いします。
【再追記】
追加質問の方は、haruo-31さん、iu43lkjds32さんがコメント欄で答えてくださいました。
私の知りたいことが全部解決したので、質問を終了させて頂きます。
ありがとうございました。m(_"_)m