2

ファイルの各行からいくつかの要素を抽出したい。以下は行です:

 #                 1150 Reading location  09ef38 data = 00b5eda4

この行からアドレス09ef38とデータ00b5eda4を抽出したいと思います。

私が使用する方法は、以下のような単純なものです。

while($line = < INFILE >) {

    if ($line =~ /\#\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*=\s*(\S+)/) {
       $time = $1;
       $address = $4;
       $data = $6;
       printf(OUTFILE "%s,%s,%s \n",$time,$address,$data);
      }
}

これを行うためのより良いアイデアはありますか?簡単できれい?

どうもありがとう!

TCGG

4

4 に答える 4

2

別のオプションは、文字列を空白で分割することです。

my ($time, $addr, $data) = (split / +/, $line)[1, 4, 7];
于 2012-11-29T23:12:01.063 に答える
2

次のような LHS のマッチングとリストを使用できます。

echo '# 1150 Reading location 09ef38 data = 00b5eda4' | 
  perl -ne '
    $,="\n";
    ($time, $addr, $data) = /#\s+(\w+).*?location\s+(\w+).*?data\s*=\s*(\w+)/;
    print $time, $addr, $data'

出力:

1150
09ef38
00b5eda4
于 2012-11-29T23:03:44.643 に答える
0

を使用して、任意の種類の1つ以上の空白で分割するのが便利だと思います\s+。このように、入力文字列にスペースではなくタブ文字が含まれていても問題はありません。

while($line = <INFILE>)
{
    my ($time, $addr, $data) = (split /\s+/, $line)[1, 4, 7];
}

任意の種類の空白で分割する場合、最後に改行で分割されることに注意することが重要です。そのため、戻り値の最後に空の要素が表示されます。ただし、ほとんどの場合、返される要素の合計量を気にしない限り、気にする必要はありません。

于 2012-11-29T23:30:53.183 に答える
0

Python では、適切な正規表現は次のようになります。

'[0-9]+[a-zA-Z ]*([0-9]+[a-z]+[0-9]+)[a-zA-Z ]*= ([0-9a-zA-Z]+)'

しかし、私はそれをperlで書く方法を正確に知りません。検索できます。この正規表現の説明が必要な場合は、この投稿をより正確な説明で編集できます。

于 2012-11-29T23:05:42.270 に答える