全角半角を区別しないパターンマッチ

せっかくなのでコーディング的なノウハウも書いてみます。
検索エンジンでは、アルファベットの大文字小文字を標準で同一視するものがほとんどですが、日本語ではあまり意味がありません。
日本語の場合、全角カナと半角カナ、または全角英数字と半角英数字のように、全角と半角が混在する状況のほうが多いと思います。ですが、そのためのコード記述のノウハウというのがなかなか見当たらないので、自分でとりあえず作ってみました。
わりと稚拙なコードですが自由に使ってください。仕掛けは簡単で、Jcodeの全角⇔半角変換機能を使っているだけです。カナまたは英数字が存在した場合のみ配列のリファレンスを返しているというアドホックなコードなので、その辺は各自直してください。それと、モジュール内のコードを持ってきたものなので$thisとかありますがその辺も適宜。

# 全角半角を区別しないパターンマッチ
sub init_zenhan {
	$::zenkaku_alphabet = '0-9A-Za-z'.' ()_@−';
	my $j = Jcode->new($::zenkaku_alphabet, CHARSET);
	$::zenkaku_alphabet = $j->euc;
	$::hankaku_alphabet = '0-9A-Za-z'.' ()_@-';
}
sub zenhan_quote {
	my ($this, $s) = @_;
	$this->init_zenhan() unless defined $::zenkaku_alphabet;
	my $j = Jcode->new($s, CHARSET);

	# 半角カナ、半角英数字
	my $s_kh_ah = $j->z2h->tr($::zenkaku_alphabet, $::hankaku_alphabet)->sjis;
	# 半角カナ、全角英数字
	my $s_kh_az = $j->z2h->tr($::hankaku_alphabet, $::zenkaku_alphabet)->sjis;
	# 全角カナ、半角英数字
	my $s_kz_ah = $j->h2z->tr($::zenkaku_alphabet, $::hankaku_alphabet)->sjis;
	# 全角カナ、全角英数字
	my $s_kz_az = $j->h2z->tr($::hankaku_alphabet, $::zenkaku_alphabet)->sjis;

#	print "$s:\n$s_kh_ah\n$s_kh_az\n$s_kz_ah\n$s_kz_az\n";exit;

	# カナまたは英数字が含まれていれば4パターンを配列化
	if ($s_kh_ah ne $s_kz_az) {
		my %count;
		my @s = ($s_kh_ah, $s_kh_az, $s_kz_ah, $s_kz_az);
		@s = grep(!$count{$_}++, @s);
		$s = \@s;
	}
	return $s;
}

# 使い方
{
	my @words = ('カナ&ALPHABET', '漢字と平仮名のみ');
	grep { $_ = $this->zenhan_quote($_) } @words;
	
	# パターン作成
	grep { $_ = quotemeta($_) } @words;
	foreach my $word (@words) {
		if (ref($word) eq 'ARRAY') {
			my $search_pattern = "(?:".join("|",@$word).")";
		}
		else {
			my $search_pattern = $word;
		}
	}
}