2013-04-10 9 views
1

디렉토리/하위 디렉토리에있는 여러 html 파일을 동일한 디렉토리 내의 단일 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

너는 단지 N 개의 파일을 하나의 파일로 묶고 싶을 뿐인가? – TLP

+1

Windows 셸에서'copy' 명령을 사용하여 파일을 연결할 수도 있습니다. 복사 file1 + file2 allfiles입니다. 자세한 정보는'copy /? '를보십시오. – TLP

+0

이 질문을 참조하십시오 http://stackoverflow.com/questions/60244/is-there-replacement-for-cat-on-windows – TLP

답변

5

오류는 대개 "현재 디렉토리"c:\test\.을 열려고 시도했을 때 발생합니다. 이것은 readdir을 사용하여 파일을 나열합니다. readdir에는 모두 파일이 포함됩니다.

당신이 원하는 것은 파일을 연결하는 것인데, 만약 당신이 리눅스에 있다면 간단하다 : cat test/* > final.htm. 불행히도 Windows에서는 약간 더 까다 롭습니다.

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

설명 :

우리는 읽고 인수 파일 이름의 내용을 인쇄 할 -p 옵션을 사용합니다. 이러한 인수는이 경우 glob이고 windows 명령 셸은 자동으로 이러한 glob을 수행하지 않으므로 내장 된 glob 명령을 사용하여 perl에 요청해야합니다. 우리는 BEGIN 블록에서이를 수행하여 나머지 코드와 구분합니다. "나머지 코드"는이 경우 파일의 내용을 읽고 인쇄하는 블록 (기본적으로 while (<>) { print })입니다. 줄의 끝에서 모든 출력을 final.htm 파일로 리디렉션합니다.

왜 을 readdir 이상 사용 하시겠습니까? 글쎄, 한가지 들어, readdir 디렉토리에 . (현재 디렉토리)와 .. (부모 디렉토리)를 포함하고 있는데, 이것은 내가 위에서 언급 한 것처럼 코드를 망칠 것입니다. 디렉토리를 필터링해야합니다. 그리고 glob은 문제없이 원활하게 처리합니다. 이 스크립트의 긴 버전을 원한다면

, 당신은 내가 당신이 단지 HTML 파일을 병합 할 것으로 생각

use strict; 
use warnings; 

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

참고 할 수 있습니다. 그래서 아마 파일 밖으로

*.htm *.html 
+0

안녕하세요, 나는 이것을 시도했지만 아래 오류가 나타납니다. inplace edit : C :/test /는 일반 파일이 아니며, <> 줄 ... – VSr

+0

그 오류는 -i 스위치 (in-place edit)를 사용하면 발생합니다. 나는 당신이 그것을 사용해야한다고 말한 적이 없으며 어쨌든 도움이되지 않을 것입니다. – TLP

+0

더 긴 버전의 스크립트에서 언급했던 것과 같은 줄을 사용했으나 오류 메시지 만 가져 오는 결과를 얻을 수 없습니다. – VSr

1

필터처럼 뭔가 *에서 글로브를 변경할 수의 좋은 생각이 될 것입니다 "." 및 ".."를 @files 목록에서 삭제하십시오.