(専門外なので知らなかったのですが)Perlは内部処理をUTF-8で行っているそうです。
そのため、普段Windows上で使っているShift_JISのファイルを扱おうと思ったら、ファイルの読み込み時にUTF-8に変換し、ファイルの出力時に再びShift_JISに変換しなければならないようです。
open(IN, "<:encoding(shiftjis)","$in");
しかし、この時、機種依存文字を含んだShift_JISのファイルを読み込ませるとUnicodeにマッピングできない旨の警告が発生し、
shiftjis "\x87" does not map to Unicode at hoge.pl line 38, <IN> line 12.
そのまま処理は続行されるものの、以下のような感じで化けてしまいます。
\x87@\x87A\x87B\x87C\x87D\x87E ...
この問題は、エンコーディングの指定を"shiftjis"ではなく"cp932"に変えることで解決します。
open(IN, "<:encoding(cp932)","$in");
Perlで言う"shiftjis"はIANA(Internet Assigned Numbers Authority)に登録されている標準のShift_JIS(JISX0201+JISX0208)で、"cp932"はベンダーが独自に拡張した文字を含んだShift_JIS(JISX0201+JISX0208+NEC特殊文字+NEC選定IBM拡張文字+IBM拡張文字)と区別されているようです。
この"CP932"は正式には"Microsoftコードページ932"と呼ばれ、IANAでは"Windows-31J"という名称で登録されています。
ゆえに、WindowsアプリケーションにおいてはShift_JISといえば"CP932"を指すのが一般的となっており、Windowsに慣れ親しんでいるとついつい区別を忘れがちになります。
ましてや機種依存文字など(特に業務システムでは)そう頻繁に使うものではないので、なおさらです。
しかし、Perlに限らずプラットフォームに依存しない言語やソフトウェアの場合は区別されていることも多く、思わぬトラブルを起こしかねないのでやはり注意しておくべきですね。
というか、文字コードや使用可能文字・禁止文字などに関しては、早い段階でビシッと決めておかなければだめですね、本来は...^^;