ただの備忘記録

忘れないように記録を残します。忘れるから記録に残してます。そして、その記録が役立つといいかな。

Perlで、データのソート

2008年11月18日 | 日記
http://www.k1s.jp/blog.cgi?n=149&category=201
cgi(perl)でのsort(ソート)記述の仕方

ハッシュを利用した方法は書かれているのですが、複数ある変数を使って、ある変数の数値を使って別の変数をソートしたい場合があります。
以下は、@data2の数値を並び替えて、同じ順序に@data1を並び替えるときの手順です。

#ソートの準備
$i = 0;
foreach (@data1) {
$i++;
@keys = $i++;
}

#@data2の並び替え順を@keysに記録
@keys = sort {$data2[$a] <=> $data2[$b]} @keys;

#@data2を並び替え
@data2 = sort {$a <=> $b} @data2;

#@data1を並び替え
@_ = @data1;
$i = 0;
foreach (@keys) {
$data1[$_] = @_[$i++];
}

#####
@data2は、ダイレクトにソートできますが、@data1は直接ソートできません。
@data1 = sort {$data2[$a] <=> $data2[$b]} @data1;
これでできそうに見えますが、@data1には@data2のデータが入ってしまいます。

Perl作業メモ

2008年11月18日 | Perl
#現在時間取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
#日付の取得
$year = $year + 1900;
$mon = sprintf("%02d",++$mon);
$mday = sprintf("%02d",$mday);
$hour = sprintf("%02d",$hour);
$min = sprintf("%02d",$min);
$sec = sprintf("%02d",$sec);

#バッファ入力
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
$buffer = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}

#デコード
$buffer =~ s/+/ /eg;
$buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

#ハッシュへの振り分け
if (index($buffer,"&") > 0) {
@lines = split(/&/,$buffer);
foreach (@lines) {
if (index($_,"=") > 0) {
($a,$b) = split(/=/,$_);
#デコード
$b =~ s/+/ /eg;
$b =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#ハッシュ
$get_buffer{$a} = $b;
} else {
$buffer = $_;
}
}
}

#アクセスログ取得
$remote_host = $ENV{'REMOTE_HOST'};
$remote_IP = $ENV{'REMOTE_ADDR'};
if ($remote_host eq '') { $remote_host = $remote_IP; }
if ($remote_host eq $remote_IP) { $remote_host = gethostbyaddr(pack('C4',split(/./,$remote_host)),2) || $remote_IP; }
if ($remote_host =~ /(.*).(d+)$/) { ; }
elsif ($remote_host =~ /(.*).(.*).(.*).(.*)$/) { $remote_host = "$2.$3.$4"; }
elsif ($remote_host =~ /(.*).(.*).(.*)$/) { $remote_host = "$2.$3"; }
$user_agent = $ENV{'HTTP_USER_AGENT'};
$referer = $ENV{'HTTP_REFERER'};

#ファイル読込
$log = "$dir_log$file_log";
@lines = "";
if (-e $log) {
open(LOG,$log);
@lines = <LOG>;
close(LOG);
}

#ファイル書込
open(LOG,">$log");
print LOG @lines;
close(LOG);