死刑執行の実態とか2006年10月01日 13時18分14秒

あんまりしつこく引き伸ばすようなネタでも無いんだけどね。

これ、なかなか興味深い記事です。まずはご一読を。

ポイントは、ずばりここ。

杉浦正健前法相が死刑執行命令書の署名を拒んだまま退任したことが、“波紋”を残している。本人が退任後も沈黙を守る中、歴代法相では異例の「在任中の執行ゼロ」がもたらす影響について関係者がさまざまな思いをめぐらせる状態だ。

異例なんだそうです。つまり、慣例だった、ということですね。

死刑執行の実態について興味深い記事を見つけたのでそちらのポイントも示してみましょう。

かなり古い記事ですが。。。注目すべきは 2000 年 12 月 1 日執筆の以下の部分。

今回の執行は、その情報を事前に得た死刑廃止議員連盟の所属議員が、松尾邦弘法務事務次官らに直接面会し、同人らに対し、死刑執行の中止を申し入れているさなかに、これをあえて無視して強行したものです。

さらに今回の執行は、本年6月9日に死刑執行ができなかったこと、内閣改造が直前に迫っており、このままでは、死刑執行をしないまま法務大臣が交代してしまうことになることをふまえて、死刑執行ゼロの年を作らないために、また死刑執行をしない法務大臣をつくらないために、あえて行われたものであって、極めて恣意的にして政治的なものです。

1993年に執行が再開されて以来、8年の間に39人が執行されましたが、再開前の8年間には、10人の執行であり、実に4倍もの大量執行となっています。しかも、93年の執行時には、死刑確定から執行までの期間は12~13年であったものが、執行のたびごとに短くなり、今回はそれぞれ6年10ヶ月、6年8ヶ月、5年7ヶ月と、ほぼ2分の1にまで短縮されており、死刑をめぐる法務当局の対応は、暴走というほかありません。

ポイントは 2 つ。

死刑執行のきっかけは、「慣例」によって成立する。

別に刑務所の空きがなくなったからとか死刑確定時に何らかの基準で保留期間が設けられるとかそういう政治的に合理的な理由によるきっかけがあるわけではなく、どちらかというと慣例的・儀式的な理由によって行われている、というのが現状のようです。だから、冒頭で紹介したような話題が、わざわざニュースとして取り上げられるというわけですね。

被害者感情への配慮、というわけでも必ずしもなさそうです。上記の記事の発信元である「死刑執行抗議集会」とやらでぐぐってみると、以下のような記事を見つけることができます。

これまた相当古い記事だったりするんですが。。。てゆか亀井のシズカちゃんとかいるのねw 彼が本気の死刑反対論者なのだとすれば、彼の行動は所謂死刑反対論弁護士たちよりよっぽど合理的ではある。

で、まぁ、この記事をだらだら読んでてもイマイチ話のピントが合ってこないので、この話のネタになっている「長谷川死刑囚」でぐぐってみっけた↓の記事を代わりにご参照くだちゃい。

よーするに被害者遺族の一人が死刑執行の停止を求めていたにもかかわらず、法務大臣の引継ぎでその意思が引き継がれなかったんだか何だかよーわからんけれども、結局死刑は執行されちゃったっていうお話。もちろん、被害者は一人ではなかったわけで、原田さん一人の意思を以って被害者の総意とするわけにはいかないわけですが、それでも必ずしも被害者が常に死刑確定者に対して刑の執行を望むわけでは無いし、執行されたからといって感情的に報われるってわけでも無いという一例。そして、死刑執行側も、必ずしも被害者感情を汲んだ死刑執行のスケジューリングを行っているわけではなさそう、という実例なわけです。

結局、死刑囚の死刑執行がいつ行われるか、なんてのは、政府の腹持ち次第、というのが現状であり、仮に死刑が廃止されて終身刑制度となったときに考えられる「囚人脱獄の不安」と同じような不安が、現行制度下において払拭されているのかどうかは極めて疑問です。もっとも、凶悪犯罪者を同時に拘留する人数が少ないという意味では、確率論的により安全と言えるのかもしれませんが。。。

所詮 8 年間で 39 人である

もうひとつのポイントは、死刑執行人数実績。年間で平均してわずか 5 人です。刑務所の維持にかかる税金についての指摘はよく耳にするのですが、刑務所入りしてからの平均寿命をおおざっぱに 40 年として、最大で 200 人前後の極刑囚人を余計にかかえることになります。これを多いと見るか、少ないと見るか。

人数だけで見るならば、彼らに飯を食わせる費用は微々たる物です。ただし、200 人を収容するのに新たに施設がもうひとつ必要、ということになれば、一時的に、若干お金がかかることになります。そして、将来的に社会情勢が常に現状維持となるとは限らないため、この人数は増える可能性もあります。

しかし、いずれにせよ刑務所は増やす必要性に迫られています (まず職員が足りていないし、キャパが足りないからという理由で安易に仮釈放してしまうという実態もあったりするらしいし)。だからこそ部分的にせよ民営化を進めていったほうがええんでないのとは前回の記事でも書いた通り。

医療費については。。。はっきり言って、囚人だけ特別扱いしないでくれってのが本音。おれらだって自分で稼いだ金を払って医者に診てもらったり薬買ったりしているわけであります。囚人だって医療を受けて生き永らえたいならそれに見合った対価に相当するだけの労働を事前に (あるいは事後にせよ) 行うべきなんじゃないのかと。金がなくて結果医療が受けられなかったことを指して非人道的だとか言うんだったらホームレスはすべからく無償で医療を受けられなきゃおかしい。そんな道理が通るはずも無いでしょう。

とまぁだいたいそんなところでしょうかと。

こ れ は 酷 い2006年10月02日 01時14分16秒

………さて。この状況でもし、給食制度を廃止したりした場合、どういう事態が起こるか。答えは明白、弁当を作ってもらえない子どもたちが続出することになるだろう。近くにコンビニあるから無問題? それだったら給食費払ってた方がよっぽど安上がりじゃね? つか、どうせコンビニで弁当買うだけの小遣いなんて子どもに持たせる気無いんだろ?

無音PCまたまた再セットアップちう(TДT)2006年10月02日 11時32分42秒

HDD が本当にクラッシュしやがった il|li_| ̄|●il|li 。

セットアップ内容は多分前回と大体同じになるかと思われ。

Perl スクリプトに assertion code を埋め込みたいのだが。。。2006年10月03日 18時11分30秒

それっぽいモジュールは存在するのだが。。。

一応 Test::Harness::Assert というのが現行の Perl には標準ライブラリとして備わっている。ちなみに、Carp::Assert なんてのも存在していて、(エーゴが苦手なりに) 流し読んでみた感触からしてこっちの方がやりたいことに近いようではあるのだが、残念ながらこちらは標準ライブラリではないため、自分が書いたプログラムのユーザーにモジュールのインストールを要求しなければならないことになり、プログラムの配布を考えている場合にはあまり現実的ではない。

Test::Harness::Assertassert (3) (所謂 ANSI C の assert マクロ) に似たインタフェースを提供してくれるようだが、assert (3) と違って本番リリース向けにはコンパイルの対象から外されるということは無い。assertion check はして欲しいが、常にして欲しいわけではなく、開発時にのみ必要なのである。しかしながら、プログラムリリースに向けて assertion code を取り除いたバージョンを生成する、といった煩わしい作業は、できれば避けたい。

プリプロセッサを利用する方法

まず、徒労に終わった調査結果を一つ示しておこう (有益な情報を得たい人はこのセンテンスは読み飛ばすべし)。Perl の -P オプションに目を付けてみた。こいつは C コンパイラのプリプロセッサを実行してから、通常の Perl による処理を行う、というもの。これによって、#if#endif#define などといったディレクティブが使えるようになる。例えば、以下の簡素なテストコードを考えてみる。

use strict;
use Test::Harness::Assert;

#ifdef _DEBUG

assert(0);  # Assertion faild!!

#endif

このプログラムは、以下のように動作する。

  • 普通に実行すると、assert 関数が実行され、Assertion check に失敗して例外を発生する。
  • perl -P test.pl とした場合、#ifdef#endif の間はプリプロセッサによって読み飛ばされるためにコンパイルされず、assert 関数は実行されない。

一見上手く動いているように見えるが、重大な問題が 2 点ほどある。

  • Windows 環境においては、C 開発環境がインストールされていることを期待せねばならない (つまり、普通の Windows ユーザーは perl -P動作させることすらできない)。ActiveState は gcc 互換のプリプロセッサまで提供してくれるわけではないようだ。
  • プリプロセッサの起動に時間がかかる。そもそもリリース時の動作を重くしたくないからこういうことを試しているのに、本末転倒である。尤も、1回の処理時間が非常に長いプログラムであれば、プリプロセッサの起動時間を考慮しても有益な対処法となりうる可能性はある。

自分で実装する

そんなわけで、究極的には結局こういう結論に至ることになる。

まず、方針を立ててみよう。

  1. Perl で記述する以上、記述したコードはコンパイルされることは避けられない。そこで、assertion check を呼び出すインタフェースとなる関数自体はコンパイルされても仕方ないものとする。
  2. しかしながら、assertion check の内容となる比較演算のコードについては、本番リリース時には実行されないのはもちろん、コンパイルすらできればされないで欲しい

上記の 2 を満たすために、Perl の eval 関数が文字列を受け取る場合、文字列として記述された Perl コードは実行フェーズにおいてコンパイルされる という性質を利用することができる。

次のコードを考えてみよう。

use strict;

our $my_debug_flag = 1;     # 実際には、十分ユニークな変数名を使用する。
                            # また、コマンドラインオプションなどによって
                            # 外部から指定可能なようにするべきである。

sub assert ($) {
    $my_debug_flag  or return;
    eval $_[0];
    $@  and die $@;
}

my $vari = 1;

assert <<ENDLINE;

    $vari == 0  or die "Assertion faild!!";     # 必ず失敗する

ENDLINE

ありがたいことに Perl は Javascript とは違って、文字列として記述し、eval に渡された Perl スクリプトであっても、スコープは有効である。これがクロージャに対しても同様 (つまり、静的スコープも保持される) であることは、以下のコードによって検証できる。

2006/10/4 1:04AM 訂正: ヒアドキュメント内で変数が展開されるので、結果スコープが生きているように見えるだけである。実際にはナマの値が埋め込まれたテキストが eval される為、例えば関数にオブジェクトなどのリファレンスを渡すような記述はできない
use strict;

our $my_debug_flag = 1;

sub assert ($) {
    $my_debug_flag  or return;
    eval $_[0];
    $@  and die $@;
}

sub test_func ($) {
    my $val = shift;
    my $closure = sub {
        assert <<ENDLINE;
            0 <= $val && $val < 128     or die "Assertion faild!!";
ENDLINE
        print "val = $val\n";
    }
}


my $c1 = test_func 0;
my $c2 = test_func 75;
my $c3 = test_func 130;

&$c1;
&$c2;
&$c3;   # ←こいつは失敗するはず

と、ここまで書いた内容をただ読んでいる人にしてみれば、この方法は実にうまくいっているように見えるかもしれないが、実際には重大な欠陥がある。上記のコードを実行すると出力結果は以下のようになるが、これが示してくれているように、この方法では、assertion check に失敗した箇所が分からないのである。

$ perl test.pl
val = 0
val = 75
Assertion faild!! at (eval 3) line 1.
$

この問題を回避するには更に一工夫が必要だ。その解決手段を示す実証コードが以下に示すものとなる。

use strict;

package MyException;    # 実際にはもちっとマシな名前をつけよう ;)
use overload '""' => \&what;

sub throw {
    my ($invocant, $what) = @_;
    my $class = ref $invocant || $invocant;
    
    my $self = { 'what' => $what };
    
    die bless $self, $class;    # 値は返さず即座に例外を飛ばす
}

sub what {
    my $self = shift;
    
    $self->{'what'}
}


package main;

our $my_debug_flag = 1;

sub assert ($) {
    $my_debug_flag  or return;
    my (undef, $file, $line) = caller;
    eval $_[0];
    if (ref $@ eq 'MyException'){
        print STDERR "$0: Assertion faild ($@) at $file line $line\n";
        exit 255;
    }
    elsif ($@) {
        die $@;
    }
}

sub test_func ($) {
    my $val = shift;
    my $closure = sub {
        assert <<ENDLINE;
            # \ を 3 つ書くところがポイント
            0 <= $val && $val < 128
                or throw MyException "over limit (\\\$val == $val)";
ENDLINE
        print "val = $val\n";
    }
}


my $c1 = test_func 0;
my $c2 = test_func 75;
my $c3 = test_func 130;

&$c1;
&$c2;
&$c3;   # 失敗しやがれっ

出力結果は以下の通り。

$ perl test.pl
val = 0
val = 75
test.pl: Assertion faild (over limit ($val == 130)) at test.pl line 42
$

例外オブジェクトを生成するということで、一見すると重い処理を行っていて効率悪そうに見えるが、実際にはデバック実行時にしか生成されないので、動作コストを考慮しても悪く無いソリューションであると思えるのだが、どうだろうか? もっとも、Perl スクリプトを色付けしてくれるエディターでは、ヒアドキュメントは一色にまとめられることが少なくないため、プログラムとしては若干見づらいという意見もあるかもしれないが。。。


Wed Oct 4 01:01:23 JST 2006 - 追記

一部訂正。。。この方法を用いる場合、検証コード内では関数、メソッドへのリファレンス渡しができません。更に言うと、オブジェクトのインスタンスメソッド呼び出しすらできません

んで、代替策を検討の末、結局こんな感じに落ち着きますた。

use strict;

our $my_debug_flag = 1;

sub assert ($) {
    $my_debug_flag  or return;
    eval { $_[0]->() };
    if (ref $@ eq 'MyException'){
        print STDERR "$0: Assertion faild ($@) at $file line $line\n";
        exit 255;
    }
    elsif ($@) {
        die $@;
    }
}

sub test_func ($) {
    my $val = shift;
    my $closure = sub {
        assert sub {
            0 <= $val && $val < 128 or die "over limit (\$val == $val)";
        };
        print "val = $val\n";
    }
}


my $c1 = test_func 0;
my $c2 = test_func 75;
my $c3 = test_func 130;

&$c1;
&$c2;
&$c3;   # 失敗しやがれっ

eval にブロックを渡し、そのブロック内で、assert 関数の引数に渡された無名関数を実行する。検証コードはコンパイルはされちゃうが、デバッグモードでなければ実行はされないという寸法。簡潔のため、例外オブジェクトの部分もばっさり削ってますが、入力にファイルを扱う場合など、もっと情報が欲しい場合には、例外オブジェクトを併用すること自体は悪くないと思う。ってなんだか言い訳がましいな(汗。

ちなみに、出力結果はこんな感じ。

$ perl test.pl
val = 0
val = 75
over limit ($val == 130) at test.pl line 17.

しかし効率はどうなんだろう。。。毎回クロージャを生成することになるわけだよなぁ。うーん。。。

まぁ本人が楽しくないんじゃな。2006年10月05日 00時07分52秒

Sound Horizon の 1st マキシが今日 (日付的には昨日) 発売された。おいらは「第二期」Sound Horizon には未だ興味を示せずにいるため、これは買っていない。講評は実際に買った人にお任せしようと思う。参考までに、Amazon における反応にリンクしてみますか。第一期を知らない人、状況がよく飲み込めていない人のコメントなどもあって、なかなか見ていて微笑ましいです。悲観的なコメントに対して作為的なまでに「参考にならない票」が注ぎ込まれているのもまた微笑ましく。。。;-p

んで、領主サイトにおける 9/24 更新時点での領主の言葉を、ここでなんとなーく引用してみたくなったりするのでありますが。。。

# 魚拓を取ろうとしたら、ちょうどぴったりのタイミングで 10/4 更新の記事に差し替わってしまった。。。_| ̄|○
今はアルバムを創る為だけに生きてます。
このところ変なテンションになっているかも知れません。
相当厳しい状況が続いているのですが、何とか頑張ってます。
クリエイターなんてものは苦しむことにこそ価値があるのだと思います。
楽しくなければ続かないけれど、楽しいだけじゃ辿りつけない場所がある。
その苦しみの一つ一つが受取る人間の楽しみに変わると思ってます。
とりあえず、楽しみにしていて貰えれば嬉しいです。

んー。今日更新された記述からもまた興味深いコメントを見つけたので、そっちも引用してみますか。(魚拓)

流石にこのオーバーワーク感とストレスは凄いです。
いくら好きなことをやっているとは言え、この疲労感はヘビィですね。
最近ちょっとした円形脱毛症になりました……なんと髭が。
うわぁ。人間そんなとこも禿るんですね。人体の神秘恐るべしっ。
とりあえず一段落して休んだら、また生えて来ると信じて頑張ってます(苦笑

プロのアーティストはどんな形であれ、苦労自慢をしてはいけないと思う。彼は今、恐らく音楽を心から楽しんではいないのだと思う。いや、本当は楽しんでいるのかもしれないけれど、こういう発言を見てしまう限りにおいて、楽しめていないように感じてしまう。楽しんで作っていない人の作品を、楽しんで演じていない人の演奏を聴いても、多分楽しめないと思う。尤も、これはおいらの持論なのであって、それでも満足する人はきっとたくさんいらっさるんだろうけれども。

。。。つか、「頑張ってます」連発するなよ。激しく痛々しい。

うををををををを……!!!!2006年10月08日 15時44分42秒

Knoppix 上で portage が動いてるぅぅぅぅぅっっ!!!!!!!!!!!!!! (←騒ぎ過ぎ)

危うく none/mnt/gentoo/procmount するとこですた。

つか、それ以前に /etc/resolv.conf をピーコするのを忘れて chroot しちゃってから「Google に ping が通らねぇよ!! 何故だっ!!!!!」とか言って焦ってたおいらはおっちょこちょいですかそうですか。OTL

を、emerge --sync 終わった。続きやっちゃお〜

デスクトップGentoo インストール顛末2006年10月10日 19時53分32秒

もう完全に俺様専用メモ。

Gentoo Linux インストールに際して、lilo のインストール完了→再起動、の手順で、以下のようなエラーメッセージが出て起動に失敗する現象が発生していた。

VFS: Cannot open root device "343" or unknown-block(3,67)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(3,67)

ちなみに、環境は、Athlon-XP ベースの自作マシンで、IDE ATA HDD 2台。/dev/hda1 には WindowsXP が入っており、Gentoo Linux については以下のような構成でインストールを行っていた (/etc/fstab より抜粋)。

/dev/hdb1   /boot   ext2        defaults,noatime    1 2
/dev/hdb3   /       reiserfs    noatime             0 1
/dev/hdb2   none    swap        sw                  0 0
...

/etc/lilo.conf の内容は大体以下の通り。

lba32
boot=/dev/hda
map=/boot/.map
root=/dev/hdb3
install=/boot/boot-menu.b
menu-scheme=Wb
prompt
timeout=150
default=Windows
vga=791

image=/boot/bzImage
    label=Gentoo
    read-only

other=/dev/hda1
    label=Windows
    table=/dev/hda

で、エラーメッセージの内容でぐぐってみるかぎり、/etc/lilo.conf か /etc/fstab のどっちかの内容が間違ってるっぽいような話が見つかったり、あるいはマザーボード換えたら解決しただのカーネルのバージョンによって起きたり起こらなかったりだのといったかなりネガティブな情報が引っかかったり、といった感じだったので、とりあえず knoppix 使うのやめてインストールしなおしてみたり /etc/lilo.conf をいろいろといじくってみたりしていろいろ試したけれども解決せず。

で、Kernel panic なのだから Kernel に問題があるんじゃないかということで make menuconfig で内容をいろいろと精査してみたところ、以下の項目についてチェックを入れて再コンパイルしてみたところ、やっとのことで起動に成功。

  • Device Drivers --->
    • ATA/ATAPI/MFM/RLL support --->
      • <*> generic/default IDE chipset support

。。。つか、何でこんな大事なオプションがデフォルトでチェック外れてるんだ!!? ヘルプ見てみたら、 If unsure, say Y. とか書いてあったで。とんでもねー罠だなwwww

ちうわけで、Gentoo に限らず、似たような症状にお困りの方は、マザーボード換装する前にまず、チェックをば。

NYY は太った日本人投手が好きらしい2006年10月11日 11時37分14秒

(〃⌒∇⌒)ノシ<バイバイ!まっつん!

。。。いろんな意味で伊良部の二の舞にならなければいいがなw

しかしお爺様のランディ・ジョンソンは仕方ないにしても、マイク・ムッシーナを切ってまで欲しい投手なんかね? >まっつん あ、NYY の場合は地区シリーズとワールドシリーズさえ抑えてくれれば十分なのかw

投手陣の若返りを、っつったって、まっつんももう 26 だしなぁ。。。

そして怪我から復帰の松井への便宜上、若手成長株のメルキーたんはトレードに出されちゃうわけだ。ドナドナド~ナ~…♪

Encode モジュールを用いた日本語処理関連メモ2006年10月11日 12時44分24秒

とりあえず見ておけ的リンク↓

で、関連する情報についていくつかメモ。

use utf8 な環境でファイル名を指定する場合の書法

ファイル名に日本語が含まれていたりすると、そのままでは確実に失敗するので、ファイル名の指定に encode() をかます必要がある。以下、サンプルコード。

use strict;
use utf8;

use Encode;
use Encode::Guess qw(euc-jp cp932 7bit-jis);

binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my $file = 'テストファイル.txt';

-e encode('cp932', $file)	or die "$file なんてファイルねっす";

open fin, '<:encoding(Guess)', encode('cp932', $file)
	or die '失敗しますた';

while (<fin>){
	print $_;
}

キャラクターセットの指定が cp932 になっているのは、このテストコードを書いた環境が Windows XP で ActivePerl 向けだから。それ以外の環境でも動かすことを想定してプログラムを書く場合は、$^O 変数を見てプラットフォームを特定したり、環境変数 LANG を参照してみたりして特定する必要があるかと思われ。つか、Windows で Perl からシステムロケールを知るにはどうすればいいんだ? レジストリ? ('A`)マンドクセ

キャラクターセットを自動認識したい

で、上記のサンプルコードにもさり気に忍ばせてあるんだけれどもw、Encode::Guess とやらを use してやることによってキャラクターセットを自動認識させることができる。

しかしこいつには問題もある。まぁシグネチャ付きの UTF-8 (言っておくが UTF-8 のシグネチャは大本営も BOM と呼んでいるが BOM ではないぞ、バイトオーダー関係ないし) なんてそもそも Perl とは水と油の関係のようなものを持ち出されても困ってしまうわけなんだろうが (こちらとしては対応してくれていない現状こそむしろ困っちゃってるわけだが)、それ以前にそもそも曖昧で判別できないようなケースに出くわすと、適当にどっちかに倒して突き進んでくれればいいようなものを、あろうことか例外を起こして処理を投げ出してしまうのである。

例えば、以下のテキストを Shift_JIS で保存したものを上記のプログラムに食わせてみると、

This file is dummy text for test.
abababababa
ubububububu
このファイルはテスト用です。
m9(^A^)プギャー
うひゃひゃひゃ

コマンドプロンプト上での結果は以下の通りとなる。

C:\foo\bar>perl test.pl
This file is dummy text for test.
abababababa
ubububububu
このファイルはテスト用です。
euc-jp or cp932 at test4.pl line 18

C:\foo\bar>

jcode.pl とかにおいても Shift_JIS の半角カナは euc-jp との判別ができずに文字化けしてしまうということはよくあったわけだが、それでもまぁ化けたら化けたなりにデータとして突っ込んでおけばいいか的な程よい諦めと安心感はあった。が、プログラムが強制的に止まってしまうとなれば話は別だ。

ちなみに open 時には自動認識を指定せずに、print する直前で decode するようにしても結果は同じである。

use strict;
use utf8;

use Encode;
use Encode::Guess qw(euc-jp cp932 7bit-jis);

binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my $file = 'テストファイル.txt';

-e encode('cp932', $file)	or die "$file なんてファイルねっす";

open fin, '<:raw', encode('cp932', $file)
	or die '失敗しますた';

while (<fin>){
	print decode('Guess', $_);	# これでも結局落ちる
}
C:\foo\bar>perl test.pl
This file is dummy text for test.
abababababa
ubububububu
このファイルはテスト用です。
euc-jp or cp932 at C:/Perl/lib/Encode.pm line 164

C:\foo\bar>

で、解決策としては、eval を用いた、若干キモチワルイコードということになる。なんだかなぁ。。。

use strict;
use utf8;

use Encode;
use Encode::Guess qw(euc-jp cp932 7bit-jis);

binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my $file = 'テストファイル.txt';

-e encode('cp932', $file)	or die "$file なんてファイルねっす";

open fin, '<:raw', encode('cp932', $file)
	or die '失敗しますた';

while (<fin>){
	my $line;
	eval { $line = decode('Guess', $_) };
	if ($@){
		$@ =~ s/\sat\s.*$//;
		my @charset = split /\sor\s/, $@;
		$line = decode(shift(@charset), $_);
	}
	print $line;
}
C:\foo\bar>perl test.pl
This file is dummy text for test.
abababababa
ubububububu
このファイルはテスト用です。
"\x{24f0}" does not map to cp932 at test4.pl line 25,  line 5.
m9(^A^)餅迎\x{24f0}
うひゃひゃひゃ

C:\foo\bar>

それでもなんだかアヤシゲな警告が出てきちゃうのまでは回避できないのだ。なんだかなぁ。。。(;_;)/