2014-07-21 4 views
0

이것은 내가 작성한 두 번째 펄 스크립트 일 뿐이므로 모든 건설적인 도움/조언이 크게 감사 할 것입니다. 또한 Strawberry Perl을 사용하여 Windows 컴퓨터에서 작업 중입니다. 나는 깔끔한 모듈이 Perl을 위해서 존재한다는 것을 알고있다. (이 노트에서 설명 할 가치가없는 이유로) 모듈을 사용하는 것과는 반대로 스크립트에서 tidy.exe를 호출하는 것을 선호한다. 내 펄 스크립트가 수행 할 작업을커맨드 라인에서 아이콘을 실행하고있는 아이콘에서 그것을 실행하면 왜 perl 스크립트가 다르게 동작합니까?

:

  1. HTML 파일을 가지고는, 그것을 복사하고,에게 .XML 확장을 제공합니다.

  2. 새로 형성된 .xml 파일에서 tidy.exe를 실행하여 올바른 형식의 xml로 만듭니다. 내가 원하는 결과를 생성 다음 명령 G:\TestFolder>perl tidy_cleanup.pl을 사용하여 명령 줄에서 실행하면

  3. 는 스트립 새로 만든, 잘 형성에서 XHTML 네임 스페이스

.xml 파일. 그러나 아이콘에서 스크립트를 실행하면 위의 2 단계를 건너 뜁니다. 아래에 게시 된 코드를 기반으로 왜 이런 식으로 행동하는지 알 수 있습니까?

여기 내 코드입니다 :

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Basename; 
use FileHandle; 

my $basename; 
my @files = glob("*.html"); 

foreach my $file (@files) { 

    my $oldext = ".html"; 
    my $newext = ".xml"; 
    my $newerext = "v2.xml"; 

    my $newfile = $file; 
    $newfile  =~ s/$oldext/$newext/; 

    my $newerfile = $newfile; 
    $newerfile =~ s/$newext/$newerext/; 

    open IN, $file or die "Can't read source file $file: $\n"; 
    open OUT, ">$newfile" or die "Can't write on file $newfile: $!\n"; 

    print "Copying $file to $newfile\n"; 


{while(<IN>) 

{ 
print OUT $_; 

close(IN); 
close(OUT); 


} 

my $xmltidy = "for \%i in ($newfile) do c:\\Tidy\\tidy.exe --output-xml yes --numeric-entities yes --doctype omit --quote-nbsp no -asxml -utf8 -numeric -m \"\%i\""; 
system($xmltidy); 


print "\nfinished running tidy \n\n"; 
} 

    { 
    open NEWIN, "$newfile" or die "Can't read source file $newfile: $!\n"; 
    open NEWOUT, ">$newerfile" or die "Can't write on file $newerfile: $!\n"; 

    print "Copying $newfile to $newerfile\n"; 
    { 
     while (<NEWIN>) { 
     if (/(\<html)(xmlns="http:\/\/www.w3.org\/1999\/xhtml" xml:lang="en-GB")(.*)/) { 
      print NEWOUT "<html$3"; 
     } 
     else { 
      print NEWOUT $_; 
     } 
     } 

     close(NEWIN); 
     close(NEWOUT); 
    } 
    } 
} 
+0

이 프로그램은 그러나 당신이 그것을 실행 아무것도 유용하지 믿기 어렵다. 첫 번째'while' 루프 내에서 입력과 출력 파일을 닫습니다. 그래서 한 줄만'$ newfile'에 복사됩니다. 닫힌 파일 핸들에서'readline() '과 같은 에러 메시지를 보았을 것입니다. 왜 우리에게 그들에 대해 말하지 않았습니까? 프로그램이 무엇을해야하는지 정확히 설명하면 해결할 수 있도록 도와 줄 것을 제안합니다. 첫 번째'if' 문은 목적을 가져야 만한다고 묘사했던 것보다 더 많은 것 같습니다.''태그 전에 모든 것을 제거하는 것입니다. – Borodin

+0

맞아요, readline()을 봅니다. – 1723842

+0

삭제 된 if 문에 대한 새 코드 – 1723842

답변

1

프로그램이 잘못된 디렉토리에 HTML 파일을 찾는 것을 할 수있는 바로 가기를 통해 작동하지 않는 이유. 명령 줄에서 perl tidy_cleanup.pl을 실행하면 현재 작업 디렉토리에서 찾습니다. 그러나 바로 가기를 설정할 때 Start in:이라고 표시된 필드에 현재 디렉토리를 지정해야합니다.

그러나 내 의견에 말했듯이 while 루프 내에서 파일 핸들을 닫으므로 HTML에서 XML로 복사 할 때 파일의 한 줄만 처리합니다.

이것은 내가 원하는 것이라고 생각하는 글입니다.

use strict; 
use warnings; 
use autodie; 

use File::Copy 'copy'; 

my $tidy = 'C:\Tidy\tidy.exe'; 
die "'tidy.exe' not found" unless -f $tidy; 

for my $html_file (glob '*.html') { 

    (my $xml_file = $html_file) =~ s/\.html\z/.xml/; 
    copy $html_file, $xml_file; 

    print qq{Tidying "$xml_file"\n}; 

    qx{"$tidy" --output-xml yes --numeric-entities yes --doctype omit --quote-nbsp no -asxml -utf8 -numeric -m "$xml_file"}; 

    print "Finished running tidy\n\n"; 

    (my $v2_file = $xml_file) =~ s/\.xml\z/_v2.xml/; 
    open my $xml_fh, '<', $xml_file; 
    open my $v2_fh, '>', $v2_file; 

    print qq{Copying "$xml_file" to "$v2_file"\n}; 

    while (<$xml_fh>) { 
    s/\s*xmlns="[^"]+"//; 
    s/\s*xml:lang="[^"]+"//; 
    print $v2_fh $_; 
    } 

    print "Copy complete\n\n"; 
} 
+0

그래서 이것을 실행하면 읽을 수 없습니다 : '* .xml'을 읽기 위해 열 수 없습니다 : tidy_cleanup.pl 행의 'Invalid argument' 19. – 1723842

+0

@xslt_user : 19 번째 줄은'print' 문입니다. 프로그램에 19 번째 줄이'qx'가되도록 추가했다면, 여러분이 한 것을 말하십시오. 첫 번째 게시물 이후 몇 가지 변경 사항을 작성했으며, 신속하게 가져 가면 버그가있는 버전이있을 수 있습니다. 다른 복사본을 가지고 다시 시도하십시오. – Borodin

+0

새로운 수정 사항이 적용되었습니다. 아래 코드를 사용하여 작동하도록했습니다. – 1723842

0
use strict; 
use warnings; 
use File::Basename; 
use FileHandle; 

my @files = glob("*.html"); 
foreach my $file (@files) { 

my $oldext = ".html"; 
my $newext = ".xml"; 
my $newerext = "v2.xml"; 
my $newfile = $file; 
$newfile =~ s/$oldext/$newext/; 

my $newerfile = $newfile; 
$newerfile =~ s/$newext/$newerext/; 

open IN, $file or die "Can't read source file $file: $\n"; 
open OUT, ">$newfile" or die "Can't write on file $newfile: $!\n"; 
print "Copying $file to $newfile\n"; 
{while(<IN>) 

{ 
print OUT $_;  
close(OUT); 
my $xmltidy = "c:\\Tidy\\tidy.exe --output-xml yes --numeric-entities yes --doctype omit --quote-nbsp no -asxml -utf8 -numeric -m \"$newfile\""; 
system($xmltidy); 
print "\nfinished running tidy \n\n"; 
{ 
open NEWIN, "$newfile" or die "Can't read source file $newfile: $!\n"; 
open NEWOUT, ">$newerfile" or die "Can't write on file $newerfile: $!\n"; 
print "Copying $newfile to $newerfile\n"; 

{while(<NEWIN>) 
{ 
    if(/(\<html)(xmlns="http:\/\/www.w3.org\/1999\/xhtml" xml:lang="en-GB")(.*)/) {  
     print NEWOUT "<html$3";    
    }   
    else {   
      print NEWOUT $_; 
      }  
} 
close(NEWIN); 
close(NEWOUT); 
} 
}  
} 
close(IN); 
} 
}