[Tokyo.pm] Re: [Tokyo.pm] JUS感想
IMAZU Hideyo
himazu @ ms.com
1999年 10月 6日 (水) 18:32:07 CDT
At 99/10/6 20:25 +0900, Kazumasa Utashiro wrote:
> すでに perlfaq4 には、次のような記述があります。
>
> @idx = ();
> for (@data) {
> ($item) = /\d+\s*(\S+)/;
> push @idx, uc($item);
> }
> @sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
歌代さんの書法はPerl FAQですでに紹介されているのですね。だから『普通の方
法』と書かれたのですね。まだまだ勉強不足ですみません。
> キモは、やはり trick の部分ではないでしょうか。JAPH と同じで。
すみません、JAPH って何ですか。
--
『普通の方法』とシュワルツ変換でメモリー消費がどれくらい違うかを試してみ
ました。ある時点でどれだけメモリーを使っているかプロセス自身で調べる方法
を知らないので(ご存知のかた教えてください)、処理が終わった旨をSTDERRに
出力してsleep 10している間にtopコマンドでメモリー消費を確認しました。
32668行のpasswdファイルをGID、UID、ログイン名で並べ替えた場合、『普通の方
法』で17M、シュワルツ変換では34Mのメモリー消費でした。
--
今津
--
#!/ms/dist/perl5/bin/perl
use strict;
open(YPCAT, "ypcat passwd|");
my @unsorted = <YPCAT>;
close(YPCAT);
my @sorted;
if ( $ARGV[0] =~ /^u/i ) {
@sorted = &utashiro(\@unsorted);
}
else {
@sorted = &perlcookbook(\@unsorted);
}
print STDERR "sorting finished.\n";
sleep 10;
exit 0;
sub utashiro {
my ($unsorted) = @_;
my (@login, $login, @uid, $uid, @gid, $gid);
foreach ( @$unsorted ) {
($login, undef, $uid, $gid) = split(/:/);
push(@login, $login);
push(@uid, $uid);
push(@gid, $gid);
}
@$unsorted[sort {$gid[$a] <=> $gid[$b] ||
$uid[$a] <=> $uid[$b] ||
$login[$a] cmp $login[$b]}
0..$#$unsorted];
}
sub perlcookbook {
map { $_->[0] }
sort { $a->[1] <=> $b->[1] ||
$a->[2] <=> $b->[2] ||
$a->[3] cmp $b->[3] }
map { [$_, (split(/:/))[3, 2, 0]] }
@{$_[0]};
}
--
今津 英世 (いまづ ひでよ)
モルガン・スタンレー証券 東京支店
Tokyo-pm メーリングリストの案内