perl5.8.xのドキュメント

ぼちぼちやってます。


メモ

うーむ、File::Slurp の read_file() でSTDINから読み込むことができない (オープンエラーになる)。 perldoc File::Slurp で見た限りではできそうな気がするんだけどなあ。

pod2htmlを使ってeuc-jpで記述したpodをhtml変換すると

  1. head2 に後続する文字列を使用したエントリが変換される
  2. item に後続するエントリが変換される

ので、head2の直後の文字列は英語のままにしてその日本語訳を後続の行に置いて、 item のエントリは訳文の後ろにカッコでくくってもとの文をつけるように しておいてから、pod2htmlで変換後に↓のようなスクリプトで調整するように した。ファイルを一気読みしてるけど、大きくても数百キロバイトのオーダーだから 問題ないだろう。多分。あとwhile()ループで、置換が行われるたびに 文字列(=ファイル内容)の先頭からマッチしなおすのが気に入らないけど これもそんなに酷使するスクリプトでもないから見逃すことにしよう。

use strict;

my $head = qr{(<h2><a name=".*">)(.*)(</a></h2>\n)<p>(.*)</p>};
my %cnv = {};

sub escape() {
    my $str = shift;

    $str =~ s/[ \']/_/g;
    $str = lc($str);
    return $str;
}

undef $/;
my $contents = <>;
while ($contents =~ s/$head/$1$4$3/) {
    my $replace  = $4;
    my $entrystr = $2;

    $cnv{$entrystr} = $replace;
}

foreach my $entry (keys %cnv) {
    $contents =~ s{<li><a href=(".*")>\Q$entry\E</a></li>}{<li><a href=$1>$cnv{$entry}</a></li>};
}

$contents =~ s/"item_.+">(.+)\((.+)\)/'"item_' . &escape($2) . '">' . "$1($2)" /ge;
$contents =~ s{<head>}
              {<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
<meta http-equiv="Content-Language" content="ja" />
              }x;


print $contents;

use encoding しているとき、例えば外部ファイルから 読み込んできたなどした内部コードに変換されていないデータに対して chompすると、 chompされたデータは内部コードに自動的に変換される。

         If the "encoding" pragma is in scope then the lengths returned
         are calculated from the length of $/ in Unicode characters,
         which is not always the same as the length of $/ in the native
         encoding.

↓openプラグマで対処できるみたい。

use encoding 'sjis';
use open IN=>':encoding(sjis)';
#binmode(STDIN, ':encoding(euc-jp)');
while (<>) {
  s/漢字/世界/;
  print $_;
}

ふむ。ARGV経由で取ってきたストリームにはuse encodingが 効いていなかったのか。


C:\home\work>cat argv.pl
use encoding shiftjis;
while (<>) {
  s/\\/./;
  print $_;
}

C:\home\work>cat b.txt
一覧表
予定

C:\home\work>perl argv.pl b.txt
一覧.
.定

C:\home\work>cat b.txt | perl argv.pl
一覧表
予定

なんかpod2htmlがうまく動かないんですが。encoding.pmを訳し終わったのに 変換すると結果が文字化けして(エラーも出ている)ダメ。元ドキュメントをsjisに してもeuc-jpにしてもutf8にしてもダメ。誰か助けて~

Copyright (C) 2004,2005

メールの宛先はこちらkbk AT kt DOT rim DOT or DOT jp

この文書の無断転載はご遠慮ください(リンクはご自由にどうぞ)。