1

ディレクトリ/サブディレクトリ内の複数のhtmlファイルを同じディレクトリ内の単一のhtmlにマージしています。私はいくつかのウェブサイトを調べて、以下のコードを試しました:

#!/usr/bin/perl -w
use strict;
use File::Slurp;
my $basedir = 'c:/test';

opendir(DIR, $basedir) or die $!;
my @files = readdir(DIR); # name arrays plural, hashes singular
closedir DIR;

my $outfilename = 'final.htm';
my $outfilesrc = undef; 

foreach (sort @files){ 
  $outfilesrc.= File::Slurp::slurp("$basedir/$_");
}

open(OUT, "> $basedir/$outfilename") or die ("Can't open for writing: $basedir/$outfilename : $!");
print OUT $outfilesrc;
close OUT;

exit;

しかし、次のエラーが発生し、ファイルをマージできませんでした。

read_file 'c:/test.' - sysopen: Permission denied at mergehtml.pl line 15

誰でも私を助けることができます!PerlでHTMLファイルをシングルにマージする方法はありますか?

4

2 に答える 2

5

c:\test\.あなたのエラーは、読み取りのために「現在のディレクトリ」を開こうとしたことが原因である可能性が最も高いです。readdirこれは、ファイルを一覧表示するためにを使用したことに由来します。すべてreaddirのファイルが含まれます。

ファイルを連結するだけの場合は、Linux を使用している場合はかなり簡単ですcat test/* > final.htm。残念ながら、Windows ではもう少し注意が必要です。

perl -pe"BEGIN { @ARGV = map glob, @ARGV }" "C:/test/*" > final.htm

説明:

オプションを使用して-p、引数ファイル名の内容を読み取って出力します。この場合、これらの引数はグロブであり、Windows コマンド シェルはこれらのグロブを自動的に実行しないため、組み込みglobコマンドを使用して perl に実行を依頼する必要があります。これを BEGIN ブロックで行い、残りのコードから分離します。この場合、「残りのコード」は、(基本的に)while (<>) { print }ファイルの内容を読み取って出力するブロックにすぎません。行の最後で、すべての出力をファイルにリダイレクトしますfinal.htm

globover をreaddir使用する理由 1 つにはreaddir、ディレクトリ.(現在のディレクトリ) と..(親ディレクトリ) が含まれているため、冒頭で述べたように、コードが台無しになります。ディレクトリを除外する必要があります。そしてglob、これを問題なくスムーズに実行します。

このスクリプトの長いバージョンが必要な場合は、次のことができます

use strict;
use warnings;

@ARGV = map glob, @ARGV;
while (<>) {
    print;
}

htmlファイルのみをマージしたいのではないかと思われることに注意してください。したがって、グロブ*を次のようなものに変更することをお勧めします

*.htm *.html
于 2013-04-10T12:08:09.687 に答える
1

ファイル "." を除外します。および @files リストの「..」。

于 2013-04-10T12:08:39.507 に答える