SJISから特定の文字列($target)を[16進]で置き換えたく以下の処理をしてるんですが、

sub change{
my ($in) = @_;
my $sjis_str = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
my $target = '[\xF7][\x41-\x9B\xA1-\xFA]|[\xF9][\x41-\x9B\xA1-\xED]|[\xFB][\x41-\x8d\xA1-\xD9]';
$in =~ s/\G((?:$sjis_str)*)($target)/$1.'['.unpack('H4',$2).']'/ego;
return $in;
}

sjisとtargetがかぶってしまっています。$sjis_strから$targetを除くとどう表現できますかね?
文字コードテーブルはよーわからんヽ(+∇+)ノ