あれ、動かしてみたけど、駄目でした。

> つまり、>>29 は、「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」を、正規表現としてコンパイルしているわけですね。

まではいいんですが、

> 実際に $GET_hoge の無効な文字列を削除するには、
> $GET_hoge =~ s/$str//g

は違ったようですね。

「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」は正しいパターンなので、

if ($GET_hoge !~ $str) {
&error("貴方が送信した文字列はShift_JISとしてValidではありません。");
}

みたいに使うってことだったようです。