0

我正在尝试在 perl 中创建一个简单的脚本,该脚本将在 xml 文件中查找明显的错误。我认为实现这一点的最佳方法是创建一个正则表达式并让 perl 使用它来返回错误的 xml 行。这是我的代码

#!/usr/bin/perl
$file = '/path/to/my/xml/file.txt';
open(txt, $file);
while($line = <txt>) {
  print "$line" if $line =~ m/<[a-zA-Z]*>[$a-zA-Z0-9]*>[a-zA-Z0-9]*</;
}
 close(txt);

我正在使用的正则表达式在记事本++中完美运行,但是当我将它放入 perl 时它不想工作。我试图找到一行看起来像这样的 xml

<tag>badline></tag>

如果我分解我的正则表达式行将返回。

m/<[a-zA-Z]*> -works
[$a-zA-Z0-9]*> -works
[a-zA-Z0-9]*</; -works

但是当我像我在代码中显示的那样组合它们时,它并没有

非常感谢任何帮助,谢谢。

4

2 回答 2

1

无论多么微不足道,您都必须始终 use strictuse warnings每个myPerl 程序的顶部声明所有变量使用它们的第一个使用点。这会警告你 Perl 试图$a在正则表达式中插入变量,该正则表达式是未定义的,因此计算结果为空字符串。

我不知道你为什么要在你的字符类中匹配美元字符,但你需要[\$a-zA-Z0-9]在 Perl 正则表达式中转义它,比如 。

不过,总的来说,除非您有特定的格式问题,否则我认为将 XML 放入 XML 解析器或编辑器会更好。这样一来,任何错误都会立即被指出,而无需您检查具体问题。

于 2013-10-10T16:33:16.543 回答
-1

我认为文件句柄最好使用大写单词,并记得在使用后关闭文件句柄。

#!/usr/bin/perl -w //try to always use warning;
use strict; //try to open strict.
open(TXT,"/path/to/my/xml/file.txt") or die "Cannot open the file $!"; 
while(<TXT>)
{
    if(/<.*>(.*)?<.*>/) // I am not sure whether you have other formats but this one works well with the format your provided. 
    {
            print $_;
    }
 }
 close TXT;
于 2013-10-10T17:42:47.517 回答