1

SUBタグからデータを1行ずつ抽出し、データをハッシュに保存したい..これを行ったが、結果が得られない

==ファイル==

<SUB>
 name1="abc"
 value1="24"
 value2="24"
</SUB>

<SUB>
 name="abc2"
</SUB>

<SUB>
 name3="ag"
 value3="27"
</SUB>

<SUB>
 name4="ljh"
 value4="90"
</SUB>

===コード===

use strict;
 use warnings; 
 open my $fh, '<', 'data_file.txt' or die $!;  

 while (<$fh>) {
    while(m{<SUB>(.*?)<\/SUB>}g){
    print $2,"|";
    }
 }

助けてください...

4

3 に答える 3

2

これはそれを行う必要があります:

use strict;
use warnings;

while (my $line = <DATA>) {
    if ($line =~ /<SUB>/ .. $line =~ /<\/SUB>/){
        if ( $line =~ /(\S+?)="([^"]+)"/ ) {
            print $1 . " = " . $2 . "\n";
        }
    }
}

__DATA__
<SUB>
 name1="abc"
 value1="24"
 value2="24"
</SUB>

<SUB>
 name="abc2"
</SUB>

<SUB>
 name3="ag"
 value3="27"
</SUB>

<SUB>
 name4="ljh"
 value4="90"
</SUB>

私のコードを理解するのに問題がある場合は、質問してください。

于 2012-08-17T07:54:16.093 に答える
0
{
local $/;
#slurp mode read whole file in
<>;
print join "|", m{<SUB>(.*?)<\/SUB>}sg;
}

1) 行ごとではなく、ファイル全体を読み取る必要があります 2) /s を追加して、ドット (.) が改行に一致するようにします。

于 2012-08-17T08:00:16.430 に答える
0

コンストラクトはwhile (<$fh>)一度にオンラインでのみ読み取ります... そして、キャプチャ グループが 1 つだけ存在する場合にキャプチャ バッファ 2 を使用します$2...文字列または連結内の未定義の変数 $2 に関する警告を受け取りませんでしたか?

これにはいくつかの解決策があります。

  1. ファイル全体を 1 つの文字列に読み取ります。

    my $fileContents = do {
       local $/ = undef; # input line seperator, undef means "slurp"
       join "", <$fh>;
    };
    while(/(...)/g) {...}
    
  2. フリップフロップ ( ..) 演算子を使用して、タグ内にあるかどうかを判断します。各タグが単独で行を占有している場合にのみ、必要に応じて機能します。コードについては、@taulisの優れた回答を参照してください。

  3. さらに便利: 入力セパレーターを終了タグに設定します。行を読み取るたびに、終了タグが検出される (インクルードされる) まで読み取ります。

    local $/ = "\n</SUB>\n";
    while (my $entry = <$fh>) {
         # only keep what's inside the tag
         $line =~ s{ <SUB> \s* (.*?) \s* </SUB> $}{$1}sx;
         # do further processing like printing
    }
    
于 2012-08-17T08:01:29.583 に答える