キーワード

プロフィール

深沢千尋

Author:深沢千尋
みなさんこんにちは、深沢千尋です。(公式ページ
文字コード【超】研究 改訂第2版NEW!」「すぐわかるPerl」「すぐわかる オブジェクト指向 Perl」の著者です。
ここでは、多くは技術的でないこと、ごくまれに技術的なことをなげやりに書いていきます。
メールは suguwakaruPerl@gmail.com まで。(アットマークは ASCII に)
Twitterはじめました。@query1000です。よろしく~

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

ブロとも申請フォーム

QRコード

QRコード

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「まるごとEncode」解題(8)ファイル処理(2)

さて、前回は

(1)外界から読み込んだオクテットストリームを decode して Perl 文字列にする
(2)Perl 文字列を処理する
(3)Perl 文字列を encode してオクテットストリームに変えて外界に書き出す

という基礎に則って以下のようなファイル処理のプログラムを書いた。

#! perl
# decodeEncodeFile.pl -- ファイルの読み込み、置換、出力

use strict;
use warnings;
use utf8;
use Encode;

for my $argv (@ARGV) {
open my $fh, "<", $argv or die "cannot open $argv because $!";
while (<$fh>) {
my $utf8 = decode("shiftjis", $_);
$utf8 =~ s{ (?:深沢|ふかざわ|フカザワ)
[\s\x{3000}]* # \s + FULLWIDTH SPACE
(?:千尋|ちひろ|チヒロ)
} {Perl Describer}gmsx;
print encode("eucjp", $utf8);
}
}
__END__

この decode、encode を消すことができる。

まず、decode であるが、open 関数の第2引数に「encoding ディシプリン」(discipline、規範)あるいは「encoding レイヤー」(layer 層)というものを追加することによって省略できる。
プログラムはこうだ。

#! perl
# decodeEncodeopen.pl -- ファイルの読み込み、置換、出力(openでdecode)

use strict;
use warnings;
use utf8;
use Encode;

for my $argv (@ARGV) {
open my $fh, "<:encoding(cp932)", $argv or die "cannot open $argv because $!";
while (<$fh>) {
s{ (?:深沢|ふかざわ|フカザワ)
[\s\x{3000}]* # \s + FULLWIDTH SPACE
(?:千尋|ちひろ|チヒロ)
} {Perl Describer}gmsx;
print encode("eucjp", $_);
}
}

__END__

変更箇所としては

open my $fh, "<", $argv or die "cannot open $argv because $!";

my $utf8 = decode("shiftjis", $_);



open my $fh, "<:encoding(cp932)", $argv or die "cannot open $argv because $!";

となった。

また、decode 関数が不要になったので中間関数 $utf8 を使わず、直接 $_ を s/// 演算子および encode 関数に渡している。

なお、encode 関数を消すこともできる。

この場合、標準出力 STDOUT はすでに open されているので、:encoding レイヤーを追加することはできない。
この場合は、本稿の場合既出だが、binmode 関数を使う。
こうだ。

#! perl
# decodeEncodebinmode.pl -- ファイルの読み込み、置換、出力(binmodeでdecode)

use strict;
use warnings;
use utf8;

binmode STDOUT, ":encoding(eucjp)";

for my $argv (@ARGV) {
open my $fh, "<:encoding(cp932)", $argv or die "cannot open $argv because $!";
while (<$fh>) {
s{ (?:深沢|ふかざわ|フカザワ)
[\s\x{3000}]* # \s + FULLWIDTH SPACE
(?:千尋|ちひろ|チヒロ)
} {Perl Describer}gmsx;
print;
}
}

__END__

変更箇所は

use Encode;

print encode("eucjp", $_);



binmode STDOUT, ":encoding(eucjp)";

print;

となった。
encode を使わないので、$_ を渡す必要がなくなったから、$_ の姿が完全に消えてしまった。
で、encode も decode も使わなくなったので use Encode がいらなくなった。

ということで、encode も decode も Encode も姿を消しているが、外界から読んできたオクテットストリームを decode して Perl 文字列にして処理し、Perl 文字列をオクテットストリームに encode して外界に書き込むという原則は変わらない。
スポンサーサイト

<< 「まるごとEncode」解題(9)Encode がサポートしている文字コードの一覧表示 | ホーム | 「まるごとEncode」解題(7)ファイル処理 >>


コメント

コメントの投稿


管理者にだけ表示を許可する

 ホーム 


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。