文字エンコードではまりまくり

はてダのバックアップをタグで解析してDBに投げる途上で

はまった。
正直さっぱりからん。日本語を含む正規表現を適用したいのだけれど。。
スクリプトはshiftjis、対象ファイルはunicode

push(@list,$str =~/日本語を含むパターン/sg);

ってところを解決すればいいのだけれど。

スクリプトファイルと対象ファイルが同じエンコードのとき

ならまんまでOK。スクリプト=対象ファイルのエンコードの出力が作られる。端末で文字化けてもファイルにリダイレクトするといい感じになってる。

スクリプトshiftjis、対象ファイルUTF-8のとき

use Encode;
$str = encode('shiftjis',decode('UTF-8',$str));

を先行してかけたらshiftjisの出力が得られる。
なんでうまくいくのかなんとなくすっきりしない。
decodeして処理、encodeして出力ってのが基本だと思ってるからなぁ。
UTF-8モードで読んでshiftjisモードに変換するの?ってことか?
なんだろうねぇ。このパターンでいけるならもうそれでイイとするのかもしれないけど。

スクリプトUTF-8、ファイルshiftjisのとき

先行フィルタを

$str = encode('UTF-8',decode('shiftjis',$str));

にするとOK。UTF-8の出力が得られる。

釈然としないけど使う事は出来そう

使用方法としては
decode→encodeしてスクリプトのエンコードにあわせる。
処理後
decode→encodeして出したい出力にする
だからUTF-8で処理したものをshifjisで出力したいなら

print  encode('shiftjis',decode('UTF-8',処理後));

とかするとshiftjisの出力が得られる。windows上でshifjisのコンソール上も文字化けしない。
とかなる。
だけどdecode/encodeが結局何してるのかわかんない。混乱してくる。

ここまでの方法論がなんか違う気がするからこうすればいいんだろう

use utf8;
use Encode;
#utf8でスクリプトを書いて
decode('読み込むエンコードスタイルたとえばshiftjis',変数);
#処理...
print encode('書き出したいスタイルたとえばeucjp',処理済み);

を徹底すればいいのだろう。
少し思考停止的ではある。今日はここまでにしよっと。