Xml 为什么从图标运行perl脚本与从命令行运行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

这只是我写的第二个perl脚本,因此非常感谢任何有建设性的帮助/建议。另外,请注意,我正在Windows机器上使用草莓Perl。我知道Perl有一个Tidy模块,但是(出于本说明中不值得解释的原因)宁愿从脚本中调用Tidy.exe,而不是使用该模块

我希望我的perl脚本执行的操作:

  • 获取一个html文件,复制它,并给它一个.xml扩展名

  • 在新格式的.xml文件上运行tidy.exe,使其成为格式良好的xml

  • 从新创建的格式良好的.xml文件中删除xhtml名称空间

  • 当我使用下面的命令
    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);
    }
    }