Oct 22, 2011
Strawberry Perl 5.12.3.0 をインストール
2011年11月12日追記:ぽち*ぷ〜ちのいさましいちびのツールたち unzip.pl untar.pl enc.pl に untar.pl についてもう少しだけ詳しく書きました。
Windows上で使う Perl に疎いぽちは、Perl で書いたコードを Windows上で実行可能な単独の exeファイルに纏める PAR、PAR::Packer というモジュールがある事を最近知りました。これらのモジュールは何も Windows の exe形式だけに限らず単独の実行形式ファイルを作るのに使えるのですけども、Windows上で Perl のコードから単独で実行可能な exeファイルを作るのは、Perl をインストールさせる事なく、Perl で書いたものを気軽に「これ使ってね♪」と渡せるという点ではとっても便利そうな気がします。
そこでぽちは、父が年賀状作成と孫たちの動画の保管や写真のプリントにしか使っていない、インターネット回線にさえ繋げる気が無い Windows Vista機に Strawberry Perl 5.12.3.0 を入れる許可を得て、インストールしてみました。Strawberry Perl自体は msi に纏められているので、オフラインでもぽちの Linux機でダウンロードしたものを持って来て簡単にインストール出来るのですけども、追加でインストールしたいモジュールは CPAN Search で個別に探してダウンロードして、それぞれ CPAN Dependencies で依存関係を確認しながら、必要なものから順序良く手動で入れるという作業をする事になってしまいました。
父の Vista機を回線に繋げられれば、わざわざこんな作業をしなくても cpanm なり、cpanm -f なりで済んでしまうんですけど、自分の PC じゃ無い以上「回線には繋げるな」という父の意向を無視するわけにはいきません。今時、私用の PC をスタンドアローンで使うなんていうセキュリティ確保の方法は現実的じゃない気がしますが…ぽちが言っても耳を貸してくれませんでした。
Vista機は数年前の購入時のままの状態で、Perlモジュールの圧縮形式、tar.gzファイルを展開するツールなんて入っていません。そこで入れたばっかりの Perl を利用してコマンドプロンプトから
C¥> perl -MArchive::Extract -e "$ae = Archive::Extract->new(archive => q/Path-Class-0.24.tar.gz/); $ae->extract;"
こんなふうにワンライナーで展開してみました。
これで充分用は足りるんですけども、ついでなのでぽちの unzip.pl を Archive::Tar で書き換えてこんな感じにしてみました。
untar.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Archive::Tar;
use utf8;
use Encode;
use Encode::UTF8Mac; # utf-8-mac は fオプションでしか使えません。
use Encode::Guess qw/ euc-jp cp932 iso-2022-jp utf8 /; # 自動推測の対象
use Encode::Locale;
use Path::Class;
use Getopt::Std;
my %opts;
getopts('f:', \%opts);
@ARGV or die "Usage: untar.pl [-f encoding_name] tar_file\n";
foreach ( @ARGV ) {
my $file = file $_;
my $tar = Archive::Tar->new();
$tar->read( "$file" ) or die "Couldn't read: $file\n";
my $str;
$str .= $_ foreach ( $tar->list_files );
my $enc_name;
if ( $opts{ f } ) {
$enc_name = $opts{ f };
} else {
my $enc = Encode::Guess->guess( $str );
ref $enc ? $enc_name = $enc->name : die "Couldn't guess: $enc\n";
}
foreach ( $tar->list_files ) {
my $file = file( encode( 'locale_fs', decode( $enc_name, $_ ) ) );
my $dir = $file->parent;
-d $dir or dir( $dir )->mkpath;
print "extract $file ...";
$tar->extract_file( $_, "$file" );
print "done.\n";
}
}
exit;
見ての通り対象となるファイルのアーカイブ・圧縮形式が違うだけで、使い方は unzip.pl と同じです。
C¥> perl untar.pl [-f エンコード名] tarファイル
追加したモジュールですけども、文字コードが cp932 の日本語版Windows上で Encode::Locale のテストの t/env.t が通らないのは有名みたいですね。
- Bug #69256 for Encode-Locale: env.t fails on Win32
- [perl #89904] Build test FAIL on t/env.t of Encode-Locale-1.02
調べたらこんな感じだった。
env.t
> Encode::Locale::reinit("cp1252");
Windowsではコードページの変更が出来ない
> $ENV{"m\xf6ney"} = "\x80uro";
・コードページ"cp932"(日本標準)ではこの設定ができない
・なぜかPerlが落ちる
・コードページが元から"cp1252"(西欧標準)の場合は上手く行く
英語版のWindowsだと問題を把握できないかも。
とりあえずテストの失敗を無視して入れてもきちんと動いているようです。
writeback message: