人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perlのプログラムについての質問です。
ランダムに選んだファイル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;

●質問者: uta_at_home
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:open Perl PUSH Rand ほと
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● tkyk3
●120ポイント ベストアンサー

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


2 ● iu43lkjds32
●120ポイント

@Data01から@Data10を別に使うのでなければ,以下のように書き換えていけます。

1.

@Data01から@Data10を全て @Data00 に,

DATA_01_H から DATA_10_H を全て DATA_00_H に書き換える

2.

上記の書き換えたプログラムは10回同じことを繰り返しているので,

for で10回まわすように書き換えられる

同じファイルハンドルと配列を使い回しても大丈夫なはずです。

◎質問者からの返答

回答ありがとうございます。

私もファイルハンドルや配列を使い回すことを考えていたのですが、リファレンスを使って配列の配列を作る際、配列のメモリ領域が上書きされてしまうのではないかと心配だったのです。


3 ● haruo-31
●120ポイント

今回は何がしたいのか、ちょっと分からなかった&酔ってるので、

こんな感じでヒントになるでしょうか。

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


4 ● tkyk3
●20ポイント

皆さんの意見通りかと存じます。(既に解決済みかと思うのでコメントにしました)

一応、しゃしゃり出ておきます(^^;

◎質問者からの返答

ありがとうございます。m(_"_)m

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ