合并多个HTML文件

时间:2013-04-10 11:59:13

标签: perl

我将目录/子目录中的多个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文件合并为单个文件?

2 个答案:

答案 0 :(得分:5)

您的错误很可能来自于尝试打开“当前目录”c:\test\.进行阅读。这来自于使用readdir列出文件:readdir包含所有文件。

如果您只想连接文件,如果您使用的是Linux,则相当简单:cat test/* > final.htm。不幸的是,在Windows中它有点棘手。

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

说明:

我们使用-p选项来读取和打印参数文件名的内容。这些参数在这种情况下是一个glob,并且windows命令shell不会自动执行这些glob,所以我们必须使用内置的glob命令让perl执行它。我们在BEGIN块中执行此操作以将其与其余代码分开。在这种情况下,“其余代码”只是(基本上)一个while (<>) { print }块,它读取并打印文件的内容。在该行的末尾,我们将所有输出重定向到文件final.htm

为什么在glob上使用readdir?好吧,首先,readdir包括目录.(当前目录)和..(父目录),这会弄乱你的代码,就像我在顶部提到的那样。您需要过滤掉目录。并glob顺利完成,没有任何问题。

如果您想要此脚本的较长版本,可以执行

use strict;
use warnings;

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

请注意,我怀疑您只想合并html文件。因此,将您的glob从*更改为

之类的内容可能是个好主意
*.htm *.html

答案 1 :(得分:1)

过滤掉文件“。”和@files列表中的“..”。