Xml 为什么从图标运行perl脚本与从命令行运行perl脚本的行为有所不同?
这只是我写的第二个perl脚本,因此非常感谢任何有建设性的帮助/建议。另外,请注意,我正在Windows机器上使用草莓Perl。我知道Perl有一个Tidy模块,但是(出于本说明中不值得解释的原因)宁愿从脚本中调用Tidy.exe,而不是使用该模块 我希望我的perl脚本执行的操作:Xml 为什么从图标运行perl脚本与从命令行运行perl脚本的行为有所不同?,xml,perl,tidy,perl-tidy,Xml,Perl,Tidy,Perl Tidy,这只是我写的第二个perl脚本,因此非常感谢任何有建设性的帮助/建议。另外,请注意,我正在Windows机器上使用草莓Perl。我知道Perl有一个Tidy模块,但是(出于本说明中不值得解释的原因)宁愿从脚本中调用Tidy.exe,而不是使用该模块 我希望我的perl脚本执行的操作: 获取一个html文件,复制它,并给它一个.xml扩展名 在新格式的.xml文件上运行tidy.exe,使其成为格式良好的xml 从新创建的格式良好的.xml文件中删除xhtml名称空间 当我使用下面的命令G:\Te
G:\TestFolder>perl tidy\u 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);
}
}
}
#/usr/bin/perl
严格使用;
使用警告;
使用File::Basename;
使用文件句柄;
我的$basename;
my@files=glob(“*.html”);
foreach my$文件(@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/;
在$file中打开或死亡“无法读取源文件$file:$\n”;
打开“>$newfile”或“无法写入文件$newfile:$!\n”;
打印“将$file复制到$newfile\n”;
{while()
{
打印出美元;
关闭(IN);
收尾;
}
my$xmltidy=“for\%i in($newfile)do c:\\Tidy\\Tidy.exe——输出xml是——数字实体是——doctype省略——引用nbsp否-asxml-utf8-数字-m\%i\”;
系统(美元);
打印“\n完成运行\n\n”;
}
{
打开NEWIN,“$newfile”或die“无法读取源文件$newfile:$!\n”;
打开NEWOUT“>$newerfile”或die“无法写入文件$newerfile:$!\n”;
打印“将$newfile复制到$newerfile\n”;
{
而(){
如果(/(\程序无法通过快捷方式工作的原因可能是它在错误的目录中查找HTML文件。当您从命令行运行perl tidy\u cleanup.pl
时,它会在当前工作目录中查找,但是当您设置快捷方式时,需要在标记为起始位置的字段中指定当前目录:代码>
但是,正如我在评论中所说,当您从HTML复制到XML时,您只处理文件的一行,因为您在while
循环中关闭了文件句柄
这就是我写我认为你想要的东西的方式
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";
}
使用严格;
使用警告;
使用自动模具;
使用文件::复制“复制”;
my$tidy='C:\tidy\tidy.exe';
死“'tidy.exe'未找到”,除非-f$tidy;
对于我的$html_文件(glob'*.html'){
(my$xml\u file=$html\u file)=~s/\.html\z/.xml/;
复制$html\u文件、$xml\u文件;
打印qq{整理“$xml\u文件”\n};
qx{“$tidy”--输出xml是--数字实体是--doctype省略--引号nbsp否-asxml-utf8-numeric-m“$xml_file”};
打印“已完成运行\n\n”;
(我的$v2\u文件=$xml\u文件)=~s/\.xml\z/\u v2.xml/;
打开我的$xml\u fh,,$v2\u文件;
打印qq{将“$xml_文件”复制到“$v2_文件”\n};
而(){
s/\s*xmlns=“[^”]+”/;
s/\s*xml:lang=“[^”]+”/;
打印$v2\u fh$;
}
打印“复制完成\n\n”;
}
严格使用;
使用警告;
使用File::Basename;
使用文件句柄;
my@files=glob(“*.html”);
foreach my$文件(@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/;
在$file中打开或死亡“无法读取源文件$file:$\n”;
打开“>$newfile”或“无法写入文件$newfile:$!\n”;
打印“将$file复制到$newfile\n”;
{while()
{
打印出美元;
收尾;
my$xmltidy=“c:\\Tidy\\Tidy.exe——输出xml是——数字实体是——doctype省略——引用nbsp否-asxml-utf8-numeric-m\“$newfile\”;
系统(美元);
打印“\n完成运行\n\n”;
{
打开NEWIN,“$newfile”或die“无法读取源文件$newfile:$!\n”;
打开NEWOUT“>$newerfile”或die“无法写入文件$newerfile:$!\n”;
打印“将$newfile复制到$newerfile\n”;
{while()
{
如果(/(\n很难相信此程序在运行时会有任何用处。在第一个循环中关闭输入和输出文件,这样只有一行会被复制到$newfile
。您会看到类似readline()的错误消息关于closed filehandle
,那你为什么不告诉我们呢?我建议你确切地解释一下程序应该做什么,这样我们就可以帮助你修复它。它似乎比你描述的要多,因为第一个if
语句必须有目的,尽管它所做的似乎只是在之前删除所有内容代码>标记你是对的,我看到readline()在第42行的closed filehandle上。删除的if语句的新代码至于我希望它做什么,这在上面的步骤1、2和3中进行了解释。我有点好奇,它看起来适用于一个文件,但您试图使用批处理语言循环调用tidy,这有什么原因吗?因此,当我运行此命令时,我得到:无法打开“*.xml”在tidy_cleanup.pl第19行读到:“无效参数”。@xslt_用户:第19行是print
语句。如果您在程序中添加了第19行,使之成为qx
,请说明您所做的操作。从第一篇文章开始,我做了一些更改,如果您很快就能找到它,您可能会有一个错误的版本。请创建另一个副本并重试。您所做的新编辑工作正常。我还使用下面的代码使其正常工作。@xslt\u用户:让您的程序正常工作做得很好,但我鼓励您使用类似我的
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);
}
}