CGI-BBS > CGI > Perl > 複数のログファイルからランダムにを一つだけオープンしたい。


カレッヂ
カレッヂ


質問者 FELIX  投稿日 9/12(木) 15:56:40
『rand関数を使用してログファイルからランダムに引き抜きしたい。』のつづきです。
以下は一つのログファイルからランダム引き抜くうえに表示数を制御する文です。
これに複数のログファイルからランダムに一つオープンさせる機能を追加したいです。

(ログファイルからランダムに4つ表示する)
open (IN,"$log_faile") || die &error ("表示システムにエラー発生!");
my @lines = <IN>;	
close (IN);

$i = 1;
srand (time^($$+($$<<15)));
	
my ($elm,$rnd);
while(@lines > 0) {
	if ($i > 5){last;}
	$rnd = int(rand $#lines+1);
	$elm = splice(@lines,$rnd,1);
	my ($title,$url,$comment,$banner) = split(/ \^ /,$elm);
	if ($banner eq '') {$banner = 'http://www.mirai.comm.to/possess/SMPTE.gif'};
	print "&nbsp;&nbsp;<a href=\"$url\" target=\"_blank\"><img border=\"0\" src=\"$banner\" width=\"88\" height=\"31\"></a>&nbsp;&nbsp;";
	$i++;
}

ファイル名が入っている配列からランダムに一つだけ
オープンするにはどうすれば良いのでしょうか?
$datxx = 'ファイル名';
@dat_data = ($dat1,$dat2,$dat3,$dat4);
  ▽
  ▼
  ▽
open (IN,"??????") || die &error ("表示システムにエラー発生!");
my @lines = <IN>;	
close (IN);

プロバイダ参照:mirai@tms.to
サーバのOS:WINサーバ
パソコンのOS:Win95系
エディタ:TeraPad
FTPソフト:FFFTP
サーバ移転:していない
改造:していない
CGI習熟度:(未選択)

回答者 しあわせのツボ  [削除]  投稿日 9/12(木) 18:30:23
open (IN,"$dat_data[int(rand($#dat_data+1))]")
で行けるかな?
randで1つ抜いてくる、という考えは同じです。


余談:
dieは異常終了扱いになるのであまりおすすめできません。
&errorの側でexitして正常に終了させてあげてください。
回答者 いのちゃん  [削除]  投稿日 9/12(木) 23:32:27
>ファイル名が入っている配列からランダムに一つだけ
>オープンするにはどうすれば良いのでしょうか?


http://www.kcb-net.ne.jp/ki-net/ana106/
このページの下の方にMystery Linkがありますのでこれをクリックするとこの画面に
設定してありますプログラムがランダムに開きます。


http://www.kcb-net.ne.jp/ki-net/webaccess/
おみくじを引くとこのページに設定した幸せの度合いを示した回答が表示する仕組みに
なっております。

詳しくは表示(V)->ソース(C)を開いて中を見てみて下さい。但しご質問に対して
的外れな回答でしたらどうぞお許し下さいね。
回答者 やまだ  [削除]  投稿日 9/13(金) 01:18:11
しあわせのつぼさんの通りでOKだと思います。
注意として、srandは、open前に一回でいいですよ。
質問者 FELIX  [削除]  投稿日 9/13(金) 09:08:53
質問のopen文を変更してみました。
でもエラーではないですけど内容が表示されませんでした。
いったいどこがひかかっているのでしょう…?

(変更前)
open (IN,"$log_file") || die &error ("表示システムにエラー発生!");
my @lines = <IN>;	
close (IN);
▼
(変更後)
open (IN,"$dat_data[int(rand($#dat_data+1))]");
my @lines = <IN>;	
close (IN);
回答者 しあわせのツボ  [削除]  投稿日 9/13(金) 14:28:51
if (!open(IN,"$dat_data[int(rand($#dat_data+1))]")) {
&error ("$dat_data[int(rand($#dat_data+1))]が読み込めません");
exit(0);
}
@lines = <IN>;
close(IN);

のようにすると、原因がわかりやすくなります。
質問者 FELIX  [削除]  投稿日 9/13(金) 22:12:46
原因が判明しました。ファイル名・配列がサブルーチン外に置かれていた事です。
ファイル名・配列を例の文が置かれているサブルーチン内に移動させたところ、
希望どうりに作動し始めました。

rand関数ってあまり専門の書籍にも少しだけ書いてあって、
くわしい説明・応用法が少ないんですよね。
私は検索サイトをやっていますが又何かあるかもしれませんが、
その時はよろしくお願いします。
ご協力ありがとうございました。/(ーoー)\

このページは終了したので返信(回答)は書きこめません

Web裏技