我将目录/子目录中的多个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;
Run Code Online (Sandbox Code Playgroud)
但我得到了以下错误,无法合并文件.
read_file 'c:/test.' - sysopen: Permission denied at mergehtml.pl line 15
Run Code Online (Sandbox Code Playgroud)
谁能帮我!有没有办法在Perl中将HTML文件合并为单个?
您的错误很可能来自于尝试打开"当前目录" c:\test\.进行阅读.这来自readdir用于列出文件:readdir包括所有文件.
如果你想要做的就是连接文件,如果你在linux中,它就相当简单了:cat test/* > final.htm.不幸的是,在Windows中它有点棘手.
perl -pe"BEGIN { @ARGV = map glob, @ARGV }" "C:/test/*" > final.htm
Run Code Online (Sandbox Code Playgroud)
说明:
我们使用该-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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我怀疑您只想合并html文件.因此,将你的glob更改*为类似的东西也许是个好主意
*.htm *.html
Run Code Online (Sandbox Code Playgroud)