使用正则表达式使用Perl搜索xml文件

时间:2013-10-10 16:24:41

标签: xml regex perl

我正在尝试在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);

我正在使用的正则表达式在notepad ++中完美运行但是当我把它放在perl中时它不想工作。我正在尝试找到一行看起来像这样的xml

<tag>badline></tag>

如果我分手,我的正则表达式行会被返回。

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

但是当我像在代码中展示的那样组合它们时,它不会

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

2 个答案:

答案 0 :(得分:1)

每个 Perl程序顶部的 use strictuse warnings必须始终 my$a,无论多么微不足道,并使用所有变量声明所有变量[\$a-zA-Z0-9]在他们的第一个使用点。那会警告你Perl试图在正则表达式中插入变量{{1}},这是未定义的,因此计算为空字符串。

我不知道为什么要匹配角色类中的美元字符,但是你需要在Perl正则表达式中将其转义为{{1}}。

总而言之,除非你有一个特殊的格式化问题,否则我认为将XML放入XML解析器或编辑器会更好。这样就可以立即指出任何错误,而无需检查具体问题。

答案 1 :(得分:-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;