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

为什么要使用globover readdir?好吧,一方面,readdir包括目录.(当前目录)和..(父目录),这会弄乱你的代码,就像我在顶部提到的那样。您需要过滤掉目录。并且glob毫无问题地顺利完成。

如果你想要这个脚本的更长版本,你可以做

use strict;
use warnings;

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

请注意,我怀疑您只想合并 html 文件。因此,将您的 glob 从更改*为类似的东西可能是一个好主意

*.htm *.html
于 2013-04-10T12:08:09.687 回答
1

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

于 2013-04-10T12:08:39.507 回答