2016/01/20

Perlでuniq

データリストとか眺める時に,項目数を数えたり,重複を排除して数えるっていうのはよくやります.Unix系のコマンドラインなら,

     % cat list | sort | uniq | wc -l

で出来ます.これをPerlでやりたいなと思ったが,どうやらuniqはPerl標準にはない模様.少し調べてみると,Array::Uniq で出来そうなので,

     % cpan install Array::Uniq

で投入.これが Mac での出来事.

***注***
このまま記事は残しますが,Perl で uniq するだけなら,keys (連想配列) する方が自然でした...こんなことも忘れてるとは(TдT)

     foreach (@input) {
       $xx{$_} = 1;
     }
     sort {$a <=> $b} keys %xx;


*******

で,Debian 環境でも同じスクリプトを動かす必要が出てきたので持って行った.

     % apt-cache search Array::Uniq

で, libarray-unique-perl が引っかかったので, install しても Array::Uniq が無いと言って動かない.よく見ない私が悪いのは明らかなのだが,入ったのは Array::Unique だった... Debian パッケージがさくっと見つかって,するする行けると思えていたのでなかなか衝撃的でした.

パッケージシステムにどっぷり(下手に逸脱したくない)なので,cpan で一般ユーザでインストールして .zshenv に PERL5LIB 書いて対処することにした.こんなこともあるんだなぁー.

ちなみに,Array::Uniq は uniq コマンドと同じ考えで良くて,

                uniq sort @input; (uniq 相当 ※重複をなくして出力)
                distinct sort @input; (uniq -u 相当 ※重複している行だけを出力)
                dups sort @input; (uniq -d 相当 ※重複していない行だけを出力)

だそうです.一方で, Array::Unique は,  @array に値を入れる都度 uniq が発動されるようです(使ったことはありません).

(余談)
@ から後を入力してたら,ユーザ候補が出てきた. Blogger も @ でユーザ管理してるんだっけ? Twitter の流儀を Facebook も流用してたりしてますが(Twitterより前の文化は知りません).