ソートの仕方教えてください

[上に] [前に] [次に]
じゃがりこ [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/</&lt;/g;
$value =~ s/>/&gt;/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/</&lt;/g;
$value =~ s/>/&gt;/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を入れ替えてください。

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