perlでデータをランダムに保存するには?

[上に] [前に] [次に]
あんでぃ [E-Mail] 1998/11/08(日) 00:06:08
普通に掲示板ではデータを保存するときに順に保存しますが、
たとえば




というデータにEを保存するときに
Dの後だけでなくAの前、Bの後、Cの後などに
データを挿入させることはできるのでしょうか?

B-Cus 1998/11/08(日) 00:53:18
int(rand(10))は、0〜9の整数をランダムに返します。
ABC…の項目数を数えて、randでどこに挿入するか決めると
いいでしょう。

乱数のシードの初期化は
 srand(time|$$);
が一般的です。

あんでぃ [E-Mail] 1998/11/08(日) 02:14:09
申し訳有りません。
挿入のさせ方も・・・分かりません。
ご迷惑をお掛けします。

Tiot [HomePage] 1998/11/09(月) 01:47:26
ほかにもっとうまい方法もあると思いますが
@a = ("a", "b", "c", "d", "e");
$new = "x";
srand(time|$$);
$max = $#a +1;
$rnd = int(rand($max));
for ($i = 0; $i <= $max; $i++) {
if ($i == $rnd) {
push (@b, $new);
} else {
push (@b, shift @a);
}
}
print @b;

とほほ 1998/11/09(月) 23:34:27
質問はこういうことではないかな?

$E="XXX";
open(IN, "file.txt");
$A = <IN>; $B = <IN>; $C = <IN>; $D = <IN>;
close(IN);
open(OUT "> file.txt");
print OUT "$A\n$B\n$E\n$C\n$D\n";
close(OUT);

つまり、ファイルに対して挿入はできないので、一度バッファに読み込
んで、ファイルを再度作り直す・・・

あんでぃ [E-Mail] 1998/11/10(火) 00:04:10
あ!そうです、そうです。
分かりにくい質問の仕方で申し訳有りません。

あと、データの数は不定になるのですが、
その場合はどのようにするべきでしょうか。
(すみません、まだまだ不慣れな物で。)

B-Cus 1998/11/10(火) 00:25:25
だから〜、ちゃんとした質問の仕方をしましょうよ〜。
1行につき1データと決めつけていいんですか?

open(IN,"file.txt");
@a = <IN>;
close(IN);

$new = "x";
srand(time|$$);
$max = $#a +1;
$rnd = int(rand($max));

for ($i = 0; $i <= $max; $i++) {
 if ($i == $rnd) {
  push (@b, "$new\n");
 } else {
  push (@b, shift @a);
 }
}
open(OUT,">file.txt");
print OUT @b;
close(OUT);

見てのとおり、ほとんどTiotさんの書かれたものと
変わってません。

失礼ながら、まずはperlの本をじっくり読まれた方が
いいんじゃないですか?

しなのむし 1998/11/10(火) 02:09:14
非常に特殊な掲示板?に思えるのですが
用途等、もっと具体的であれば答えようが
あると思うのですが・・・

とほほ 1998/11/11(水) 00:41:13
おそらく、「ランダムに挿入」ではなくて、Aの発言とBの発言の間に
Cの発言を挿入したい。けれども、ファイルへの挿入書き込みの方法が
分からなかった。・・・ということなのでしょう。

open(IN, "file.txt"); @xx = <IN>; close(IN);
open(OUT, "> file.txt");
while ($yy = pop(@xx)) {
 if (挿入したい時) { print OUT "挿入データ\n"; }
 print OUT $yy;
}
close(OUT);

あんでぃ [E-Mail] 1998/11/11(水) 10:15:24
[[解決]]
色々とありがとうございました。
これから頑張って精進していこうと思います。
perlの本は数冊買ったのですがなかなか
自分の欲しい情報が載っていなかったもので・・・
何かお薦めの本があれが教えて下さい。

それと自分が作ろうとしていたのは、
Webringのシステムです。
移動系は一応できたのですが、
登録時に何か工夫はできない物かと考えたのですが、
そこで登録を順々にするのではなくて、
今までのファイルの中にランダムに挿入していったら
面白いのでは、というアイデアだけあって
自分にそれを自作する能力が有りませんでした。

ご迷惑をお掛けしました。

しなのむし 1998/11/11(水) 17:10:36
Webringということは、ランダムに保存じゃなくてランダムに表示で
いいわけですね。(^^;
シンプルですが原形はこんな感じかな?

@datalist = ("a","b","c","d","e");
srand(time|$$);
while(@datalist){push(@randomlist,splice(@datalist,rand(@datalist),1));}
foreach $data(@randomlist){print "$data\n";}
exit;

あんでぃ [E-Mail] 1998/11/14(土) 00:23:40
えっと、ランダムに挿入して、NEXT BACKの
リンク先が時々変更になるようにしてみたかった訳です。
ずっとお隣さんが同じだったら面白くないから。

[上に] [前に] [次に]