ソートの仕方教えてください
[上に]
[前に]
[次に]
じゃがりこ
[E-Mail]
2000/01/10(月) 21:53:41
入力フォームに会員番号、名前、コメントがあり、これを入力された会員番号の若い順からソートさせ表示させたいのですが、どのようにしたらよいのでしょうか?
sortの使い方もよくわからないので、サンプルのようなものがありましたら、ご教授頂けないでしょうか?よろしくお願いいたします。
Aurai
[E-Mail]
2000/01/11(火) 03:05:17
ソートはこんな感じですが……
@num = ('2','3','1','4','7','6','8','5');
@name = ('a','b','c','d','e','f','g','h');
@comment = ('','','','','','','','');
@hush = (0,1,2,3,4,5,6,7);
@hush = sort {$num[$a] cmp $num[$b]} @hush;
foreach (@hush){
print "$num[$_], $name[$_], $comment[$_]\n";
}
Aurai
[E-Mail]
2000/01/11(火) 03:07:45
> @hush = sort {$num[$a] cmp $num[$b]} @hush;
間違いでもないがやはり下の表現の方が良さそう
@hush = sort {$num[$a] <=> $num[$b]} @hush;
じゃがりこ
[E-Mail]
2000/01/11(火) 04:49:14
下のようなプログラムの場合どのようにしたら、ソート出来るように
なるのでしょうか。ご面倒だとは思いますが、教えてください。
お願いします。
#!/usr/local/bin/perl
# Copyright (c) CGIROOM. http://cgiroom.nu
#======================================================================#
# [Ver 1.00] のんボード
#
# このプログラムによって起きた事にCGIROOMは一切責任を負いません。
# この掲示板プログラムは商用利用を問わずフリーで使用できます。
# 改造後の転載も自由です。
# それぞれの責任においてご使用下さい。
# この掲示板を思い通りに扱うには最低でもHTMLの知識は必要です。
#======================================================================#
#◆設定
#◇ jcode.plまでのパス
require 'jcode.pl';
#◇ ログの最高保存件数
$max=5;
#◇ データファイル
$bbsdata="nonbbs.dat";
#======================================================================#
# フォームデータ処理
if($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN,$QUERY,$ENV{'CONTENT_LENGTH'});
}else{
$QUERY = $ENV{'QUERY_STRING'};
}
@QUERY = split(/&/,$QUERY);
foreach (@QUERY){
($name, $value) = split(/=/);
$name =~ tr/+/ /;
$value =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\t//g;
$value =~ s/\n/<br>/g;
&jcode'convert(*value,'sjis');
&jcode'convert(*name,'sjis');
$FORM{$name} = $value;
}
#======================================================================#
# 書きこみ処理
if($FORM{'書き込む'}){
&error('会員番号が記入されていません') if $FORM{'会員番号'} eq "";
&error('お名前が記入されていません') if $FORM{'お名前'} eq "";
&error('コメントが記入されていません') if $FORM{'コメント'} eq "";
open(IN,"$bbsdata") || &error('データファイルを開けません');
@data = <IN>;
close(IN);
$ENV{'TZ'}="JST-9";
$time=time;
$times=localtime($time);
unshift(@data,"$time\t$FORM{'会員番号'}\t$FORM{'お名前'}\t$FORM{'コメント'}\t$times\t\t\t\t\n");
pop(@data) if $#data >= $max;
open(OUT,">$bbsdata") || &error('データファイルのパーミッションが違います');
print OUT @data;
close(OUT);
}
#======================================================================#
# HTML表示
print"Content-type: text/html\n\n";
print<<HTML;
<html>
<head>
<title>のんボード</title>
</head>
<body bgcolor="#FFFFFF">
<form method="POST" action="nonbbs.cgi">
<input type="hidden" name="書き込む" value="はい">
<table border="0" width="100%">
<tr>
<td colspan="2" bgcolor="#8080C0">
<font color="#FFFFFF" size="6">のんボード</font>
</td>
</tr>
<tr>
<td bgcolor="#8080C0" nowrap>
<font color="#FFFFFF"><b>会員番号:</b></font>
</td>
<td width="100%">
<input type="text" size="28" name="会員番号">
</td>
</tr>
<tr>
<td bgcolor="#8080C0">
<font color="#FFFFFF"><b>お名前:</b></font>
</td>
<td>
<input type="text" size="28" name="お名前">
</td>
</tr>
<tr>
<td valign="top" bgcolor="#8080C0">
<font color="#FFFFFF"><b>コメント:</b></font>
</td>
<td>
<textarea name="コメント" rows="7" cols="53"></textarea>
</td>
</tr>
<tr>
<td bgcolor="#8080C0">
<font color="#FFFFFF"><b>処理:</b></font>
</td>
<td>
<input type="submit" value="書き込む">
<input type="reset" value="書き直し">
</td>
</tr>
</table>
</form>
<hr>
HTML
#======================================================================#
# ログ表示
open(IN,"$bbsdata") || &error('データファイルを開けません');
while(<IN>){
($time,$DATA{'会員番号'},$DATA{'お名前'},$DATA{'コメント'},$DATA{'時間'})=split(/\t/);
print<<HTML;
<table border="0" width="100%">
<tr>
<td bgcolor="#0080C0"><font color="#FFFFFF">◆ $DATA{'会員番号'}</font></td>
</tr>
<tr>
<td>
<ul><li>$DATA{'コメント'}</li></ul>
<p><font size="2">発言日:</font>$DATA{'時間'} <font size="2">お名前:</font>$DATA{'お名前'}</p>
</td>
</tr>
</table>
<hr>
HTML
}
#======================================================================#
# HTML表示
print<<HTML;
<center><a href="../">BACK</a></center>
</body>
</html>
HTML
exit;
#======================================================================#
# エラー処理
sub error{
print"Content-type: text/html\n\n<h1>ERROR</h1>$_[0]";
exit;
}
__END__
1999/09/08 Ver 1.00 by CGIROOM
猫
2000/01/11(火) 06:10:17
どの様にソートしたいのですか?
っていうか、いったい何がしたいんですか?
これを改造することで実現するのかなぁ〜。
あんまり原型をとどめてませんが。
ハッシュキー日本語はやめました。
一応、既存の5件よりも会員番号が少なくても反映されるようになっています。
昇降順を逆にしたいなら$aと$bを入れかえる。
それと、こういうのは別ファイルでアップして、リンク張ったほうが良いと思います。
----------------------------------------------------------
#!/usr/local/bin/perl
# Copyright (c) CGIROOM. http://cgiroom.nu
#======================================================================#
# [Ver 1.00] のんボード
#
# このプログラムによって起きた事にCGIROOMは一切責任を負いません。
# この掲示板プログラムは商用利用を問わずフリーで使用できます。
# 改造後の転載も自由です。
# それぞれの責任においてご使用下さい。
# この掲示板を思い通りに扱うには最低でもHTMLの知識は必要です。
#======================================================================#
#◆設定
#◇ jcode.plまでのパス
require './jcode.pl';
#◇ ログの最高保存件数
$max = 5;
#◇ データファイル
$bbsdata = "./nonbbs.dat";
#======================================================================#
# フォームデータ処理
if($ENV{'CONTENT_LENGTH'} ne ""){
read(STDIN,$QUERY,$ENV{'CONTENT_LENGTH'});
@QUERY = split(/&/,$QUERY);
foreach $pair (@QUERY){
($name, $value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\t//g;
$value =~ s/\015\012/\n/g;
$value =~ s/\015/\n/g;
$value =~ s/\n/<br>/g;
&jcode::convert(*value,'sjis');
$FORM{$name} = $value;
}
$no = $FORM{'no'};
$name = $FORM{'name'};
$comment = $FORM{'comment'};
$ENV{'TZ'} = "JST-9";
$times = localtime(time);
#======================================================================#
# 書きこみ処理
&error('会員番号が記入されていません') if $no eq "";
&error('お名前が記入されていません') if $name eq "";
&error('コメントが記入されていません') if $comment eq "";
$i = 2;
open(IN,"+< $bbsdata") || print "$!\n";
eval 'flock(IN,2);';
while(<IN>){
push(@data,$_);
if($i == $max){
last;
}
$i++;
}
unshift(@data,"$no\t$name\t$comment\t$times\n");
@data = sort( { $b <=> $a } @data);
truncate(IN,0);
seek(IN,0,0);
print(IN @data);
close(IN);
}
#======================================================================#
# HTML表示
print"Content-type: text/html\n\n";
print<<HTML;
<html>
<head><title>のんボード</title></head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%"><form method="POST" action="nonbbs.cgi"><input type="hidden" name="書き込む" value="はい">
<tr><td colspan="2" bgcolor="#8080C0"><font color="#FFFFFF" size="6">のんボード</font></td></tr>
<tr><td bgcolor="#8080C0" nowrap><font color="#FFFFFF"><b>会員番号:</b></font></td>
<td width="100%"><input type="text" size="28" name="no"></td></tr>
<tr><td bgcolor="#8080C0"><font color="#FFFFFF"><b>お名前:</b></font></td>
<td><input type="text" size="28" name="name"></td></tr>
<tr><td valign="top" bgcolor="#8080C0"><font color="#FFFFFF"><b>コメント:</b></font></td>
<td><textarea name="comment" rows="7" cols="53"></textarea></td></tr>
<tr><td bgcolor="#8080C0"><font color="#FFFFFF"><b>処理:</b></font></td>
<td><input type="submit" value="書き込む"><input type="reset" value="書き直し"></td></tr>
</form></table><hr>
HTML
#======================================================================#
# ログ表示
open(IN,"< $bbsdata") || &error('データファイルを開けません');
while(<IN>){
($no_log,$name_log,$comment_log,$times_log)=split(/\t/,$_);
print<<HTML;
<table border="0" width="100%">
<tr><td bgcolor="#0080C0"><font color="#FFFFFF">◆ $no_log</font></td></tr>
<tr><td>
<ul>
<li>$comment_log
</ul><p>
<font size="2">発言日:</font>$times_log <font size="2">お名前:</font>$name_log</p>
</td></tr></table><hr>
HTML
}
#======================================================================#
# HTML表示
print<<HTML;
<center><a href="../">BACK</a></center>
</body>
</html>
HTML
exit;
#======================================================================#
# エラー処理
sub error{
print"Content-type: text/html\n\n<h1>ERROR</h1>$_[0]";
exit;
}
__END__
1999/09/08 Ver 1.00 by CGIROOM
猫
2000/01/11(火) 06:11:37
失礼、若い順ね。
$aと$bを入れ替えてください。
[上に]
[前に]
[次に]