0

xml ファイルで明らかなエラーを探す単純なスクリプトを perl で作成しようとしています。これを達成する最善の方法は、正規表現を作成し、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

しかし、コードで示したようにそれらを組み合わせると、そうではありません

どんな助けでも大歓迎です、ありがとう。

4

2 に答える 2

1

どんなに些細なことでも、常にすべての Perl プログラムの先頭で、使用する最初のポイントで使用するすべての変数を宣言する必要 あります。これは、Perl が正規表現内で変数を補間しようとしているという警告でした。これは未定義であり、空の文字列に評価されます。use strictuse warningsmy$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 に答える