CGI-BBS > CGI > Perl > rand関数を使用してログファイルからランダムに引き抜きしたい。


カレッヂ
カレッヂ


質問者 FELIX  投稿日 9/9(月) 01:05:45
リンク集のログファイルからrand関数を使用してランダムに引き抜きして表示させたいのですが、
どの書籍でもrand関数の使い方がいまいちでよくわかりません。
どうにか助けて頂けないでしょうか?
順番に表示すると時は、
(横に4つ並べる)

     open (IN,"ファイル名") || die &error ("表示システムにエラー発生!");
     @lines = <IN>;	
     close (IN);

	$i = 1;
	foreach $line (@lines) {
		if ($i > 4) {last;}
		($title,$url,$comment,$banner,) = split(/ \^ /,$line);
		print "<a href=\"$url\" target=\"_blank\"><img border=\"0\" src=\"$banner\" width=\"88\" height=\"31\"></a>";
		$i++;
	}
基本的にログファイル横ライン

プロバイダ参照:http://www.mirai.comm.to/
サーバのOS:UNIXサーバ
パソコンのOS:Win95系
エディタ:TerePad
FTPソフト:FFFTP
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:middle

回答者 やまだ  [削除]  投稿日 9/10(火) 00:05:21
乱数は、srandで種を設定してから、rand EXPRでEXPRまでのなから取り出すだけですよ。


open (IN,"ファイル名") || &error ("表示システムにエラー発生!");
my @lines=<IN>;
close IN;

#適当な乱数の種を設定する。
srand(time^($$+($$<<15)));

my $elm,$rnd;
#行数がなくなるまで回す。
do{
	#行数分の中から整数の乱数を発生させる。
	$rnd=int(rand $#lines+1);
	#その乱数を行数の中から取り出す。
	$elm=splice(@lines,$rnd,1);
	my($title,$url,$comment,$banner,) = split(/ \^ /,$elm);
	print "<a href=\"$url\" target=\"_blank\"><img border=\"0\" src=\"$banner\" width=\"88\" height=\"31\"></a>";
}while(@lines > 0);
質問者 FELIX  [削除]  投稿日 9/11(水) 14:11:49
最初指導どうりタイプしてアップロードしましたがサーバーエラーが発生しました。
スクリプトを直ちにエラーチェックしたところmy関数が原因だったようです。
いままでmy関数など使った事もないので混乱しましたが、my関数は2つ以上使用するときは、
myの後( )を使用しなければならない事がわかり処置をしたところ問題は回避できました。
さて、ランダムに引き抜く事が出来ましたが表示数を最初質問の文の様に制限したいです。

	srand (time^($$+($$<<15)));
	
	my ($elm,$rnd); #( )を追加
	do {
		$rnd = int(rand $#lines+1);
		$elm = splice(@lines,$rnd,1);
		my ($title,$url,$comment,$banner) = split(/ \^ /,$elm);
		print "&nbsp;&nbsp;<a href=\"$url\" target=\"_blank\"><img border=\"0\" src=\"$banner\" width=\"88\" height=\"31\"></a>&nbsp;&nbsp;";
	} while (@lines > 0);
回答者 やまだ  [削除]  投稿日 9/11(水) 23:50:16
myの使い方は、明らかなミスでした。で、
表示数を制限したいなら、カウントして、あるところまできたら抜けるっていう、
終了条件でどうでしょう。

srand(time^($$+($$<<15)));

my ($elm,$rnd,$cnt,$max);
#カウントを0にして、表示数を3つにしてみる。
$cnt=0;
$max=3;
while(@lines > 0){
	if($cnt > $max-1){last;}
	$rnd=int(rand $#lines+1);
	$elm=splice(@lines,$rnd,1);
	my($title,$url,$comment,$banner,) = split(/ \^ /,$elm);
	print "<a href=\"$url\" target=\"_blank\"><img border=\"0\" src=\"$banner\" width=\"88\" height=\"31\"></a>";
	$cnt++;
}
質問者 FELIX  [削除]  投稿日 9/12(木) 15:33:57
一部変更して表示数を制限することができました。
$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 ($no,$name,$genre,$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++;
	}
};
どうもあがとうございました。
※誤って終了ボタンを押してしまいましたのでこの件については続きがあります。

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

Web裏技