小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

ファイル分割のサンプルスクリプト

たとえば、記事数が多くなり、サイズが大きくなったhtmlファイルがあったとします。
これを記事毎のhtmlファイルに分割したい場合、以下のサンプルが参考になると思います。


このサンプルは、perlnote.htmファイル内でのh4要素からつぎのh4要素の前までの行データ(記事データ)を各々のファイルへ出力します。
つまり、h4要素単位に分割された内容のファイルがh4要素の数分作成されるわけです。


ファイル名は、「perlnote」プラス「該当h4要素のid」プラス「.htm」とします。
また、分割ファイルにはヘッダーとフッターを付加します。


尚、ヘッダーとフッターのファイルは予め用意します。
しかし、ヘッダーのtitle要素とh1要素には、該当h4要素の内容を実行時にコピーします。

サンプルソース

use strict;
# 宣言
my ($fileheadx, $fnm, $xx, $wk, $fileheader,$filefooter);

# ファイル読み込みデリミタをなしにする(ファイル全体読み込みモードにする)
$wk = $/;
$/ = undef;

# HTMLファイルヘッダー保存
open(FH, "h_perlnote.htm") || die "open err", "(h_perlnote.htm)";
$fileheader = <FH>;
close(FH);

# HTMLファイルフッター保存
open(FH, "f_perlnote.htm") || die "open err", "(f_perlnote.htm)";
$filefooter = <FH>;
close(FH);

#ファイル読み込みデリミタを普通(行単位)にする。
$/ = $wk;

open (IN, "perlnote.htm") || die "open err", "(perlnote.htm)";
open (OUT, ">dmy.tmp") || die "open err", "(dmy.tmp)";
while ($xx = <IN>) {
    if ($xx =~ /<h4 id="(.*?)"/) {
        print OUT $filefooter, "\n";
        close OUT;
        $fnm = "perlnote" . $1 . ".htm" , "\n"; # ファイル名作成
        $xx =~ /<h4.*>(.*)<\/h4>/i;
        $wk = $1;
        $fileheadx = $fileheader;
        # title要素とh1要素には、該当h4要素の内容をコピーする。
        $fileheadx =~ s/<title.*<\/title>/<title>$wk<\/title>/i; 
        $fileheadx =~ s/<h1.*<\/h1>/<h1>$wk<\/h1>/i;
        open (OUT, ">$fnm") || die "open err", "($fnm)";
        print OUT $fileheadx, "\n";
    }
    print OUT $xx;
}
print OUT $filefooter, "\n";
close OUT;
close IN;