Это всего лишь второй сценарий Perl, который я написал, поэтому буду очень признателен за любую конструктивную помощь/совет. Также обратите внимание, что я работаю на компьютере с Windows, используя Strawberry Perl. Я знаю, что для Perl существует модуль Tidy, но (по причинам, которые не стоит объяснять в этой заметке) я бы предпочел вызывать tidy.exe из сценария, а не использовать модуль.
Что я хочу, чтобы мой perl-скрипт делал:
Возьмите html-файл, скопируйте его и присвойте ему расширение .xml.
Запустите tidy.exe для только что сформированного XML-файла, чтобы преобразовать его в правильно сформированный xml.
Удалите пространство имен xhtml из вновь созданного правильно сформированного XML-файла.
Когда я запускаю его из командной строки, используя следующую команду G:\TestFolder>perl tidy_cleanup.pl
, он дает желаемый результат. Однако, когда я запускаю скрипт из значка, он пропускает шаг 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);
}
}
}
while
, поэтому в$newfile
будет скопирована только одна строка. Вы бы видели сообщения об ошибках типаreadline() on closed filehandle
, так почему же вы не сообщили нам о них? Я предлагаю вам объяснить, что именно должна делать программа, чтобы мы могли помочь вам исправить ее. Кажется, что в этом есть нечто большее, чем вы описали, поскольку первый операторif
должен иметь цель, хотя все, что он, кажется, делает, это удаляет все перед тегом<html>
- person Borodin   schedule 21.07.2014