さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

Perlで配列の重複要素を削除する&変数内のメタ文字無効化について

配列の重複要素を削除する方法は、ハッシュのキーに代入する方法が一般的みたいですが、それだと要素の順番がばらばらになってしまいます。
grepを使うとこんな感じでも重複要素の削除ができることに気づきました。

#!/usr/bin/perl
use strict;
use warnings;
use feature qw/say switch/;
use utf8;
use open IO => qw/:utf8 :std/;

my @list = qw/c java python perl ruby objective-c java ruby perl javascript/;
my @kaburi = ();

foreach my $x (@list) {
  push @kaburi, $x unless grep /^\Q$x\E$/, @kaburi;
}

say "@kaburi";

これだと、要素の順番を守ったまま重複する要素が削除できます。

c java python perl ruby objective-c javascript

スクリプトの実行結果はこんな感じになります。

\Qと\Eは間にある文字列のメタ文字を無効化してくれる効果があるようです。
変数で検索かけたいけど、変数内にメタ文字が入っているせいでエラーをはいてしまう、なんてときに使うと効果的です。