Perl製自作便利ツール紹介: 重複行抽出スクリプト

以前に書いた記事で、

この他にも自作ツールで使っているものがもう少しあって、それは超ちっちゃい、ちょっとした一つのことをやるためだけの、限られた目的をもったわずか数行のPerlスクリプトですが、地味にだいぶ役立ってもいるので(略)、次の機会ではそれを紹介したいと思っています。

と予告していたツールの一つを紹介します。

vimrcの重複問題

エディタはプログラミングのときもそれ以外のときも(仕事のテキストを編集したりメールを書いたり)使っているのはVimで、あ、ところで最近読んでいる青木峰郎さんの以下の本で、

青木さんは普段のプログラミングではVimを使って、メールや原稿書きの用途ではEmacs、その他時々IDEを使う、と書いていたので、ああ、そういうEmacsの使い方、いいなあ〜と思ったりしましたが、とりあえず僕は今全編Vimなので、そうなるとvimrcには始終付き合うことになります。

vimrc、慣れてる人は綺麗に掃除が行き届いている印象ですが、僕はあちこちで見かけたよさげな記述をただボンボン放り込んでいるだけという感じでもあり、そうなるとありがちなのが、同じ記述を複数回書いてしまう現象です。

それぞれの記述の本来的な意味などがきちんとわかってるわけでもないこと、また日常的にVimに触るとは言っても、実際の職業はプログラミングとは全然関係なかったりするので、なんだかんだでその雑で混沌としたまま、数百行にわたるそれを修正する間もなく、たとえば

set swapfile

set noswapfile

が100行ほどの間を空けてどちらも記述されていたり、あるいは

set hlsearch

が2個も3個も入ってたり、ということが普通にあります。

これを何とかしたいなあ・・とは前々から思ってはいて、それを解決するためにあちこち検索しながら書いたスクリプトがこちら、overlap.pl です。


この下方、__DATA__ 以下に対象のデータを入れて実行すると、重複している行が出てきます。

overlap:
orange
lemon

※ハッシュを使っているのでorangeとlemonの順番は時により変わります。

いわゆる車輪の再発明的なツールですが、すぐに使える他の適した道具を知らなかったので、grepやハッシュの勉強もかねて作ってみました。

あと、一度こういうのを書いて発信してみることにより、こういう場合には他の先輩方はどうしているのか、ということを知るきっかけにもなるかな、と思っています。

非重複行の抽出

ついでに、その真逆の「他のどの行とも重複していない行」も抽出できるようにしています。

具体的には、上記Gist内の7行目

my $switch = 'o';

コメントアウトして、次行の、今コメントアウトしてある

my $switch = 'u';

を生かせばOKです。

実行すると、この例の場合には apple だけが出てきます。

ただ、ところで、この非重複に関わる変数名を現時点では「unique」としていますが、普通はこの状況で unique と聞いたら、重複している行であっても一つは出しておく方が直感的な気もするので(つまり例にある果物名が全部一つずつ出てくる)、現状の意図ならばもう少し適した変数名を付けた方が良さそうとも思います。

alone とか solitude とか・・そういう仲間のいない感じ・・
いや、落ちこんできそうなので、この検討はまたにしましょう。

このスクリプトはささやかなものですが、時々使っています。
数ヶ月に1〜2度という感じでしょうか。

似たような規模のものがまだあるので、シリーズ的にもう少し続きます。