我将目录/子目录中的多个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文件合并为单个文件?
答案 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列表中的“..”。