0

次の内容を持つ 1 つの入力ファイルを解析しています。

   <tr>
 <th width="50%">ABC</th><th width="50%">XYZ</th>
   </tr>
   <tr>       
   <tr>
        <td>avc</td>
        <td>fds</td>
   </tr>

コード:

 #!/usr/bin/perl
 open(fh,$ARGV[0]) or die "could not open a file\n";
 $input=<fh>
 #print($input)
 if($input =~ /&lt;tr&gt;(\n)?(.*)(\n)?tr&gt;/)
 { 
     print($1);
 }

しかし、出力はありません。番目のタグを持つ中間行を取得するには?

4

2 に答える 2

3

1行しか読んでいない場合、複数行にまたがるテキストをどのように一致させることができますか?おそらく、ファイル全体をロードしようとしていた可能性があります。これは次のように実行できます。

my $input; { local $/; $input = <fh>; }

ちなみに、常にuse strict; use warnings;

于 2013-01-25T08:29:20.700 に答える
2

最初の行だけを読んでいるようです...

コードをwhileループの中に入れてみませんか?

(また、複数の行に一致するパターンを探しているので、提案されているように、$ /を''に設定してentiereファイルを取得することをお勧めします)

このコードは機能します:

 #!/usr/bin/perl
 open(fh,$ARGV[0]) or die "could not open a file\n";
 {
    local $/;
    $input=<fh>;
    if($input =~ /&lt;tr&gt;\s*(.*)\s*&lt;\/tr&gt;/)
     { 
         print($1);
     }
    }

(役に立たなかった\ nの周りの括弧を削除したことに注意してください)

しかし、それはあまりきれいではありません...

また、から始めてみませんか:

$input=~s/&lt/</g;
$input=~s/&gt/>/g;

コードを読みやすくするのに役立つのはどれですか?

于 2013-01-25T08:29:43.287 に答える