[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 メーリングリストの案内