我正在尝试在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
但是当我像在代码中展示的那样组合它们时,它不会
非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
每个 Perl程序顶部的 use strict
和use 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;