2011-08-01 16 views
3

私はPerlを使いこなしており、部分文字列/正規表現の機能をよりよく理解しようとしています。 [0] * "" <Perlの正規表現を使って部分文字列を返す

のeval * 0 *フレーム*> 33 * 1311875297587および1311875297587を返すようにしたい:送信:[31.8 48]

は、私は、このような

として文字列を持っていると言います。それは常にその形式になります。私はPerlを使ってどのようにこれを行うでしょうか?

と仮定すると、感謝

+1

興味のある部分を特定する方法を説明します。少なくとも3桁の長さの文字列? ">"に続いて4文字目から始める? "* eval"の前の数字? etc ... – tadmc

答えて

8

"[48:31.8]は..." そして、$文字列である:文字列が一致しない場合

my ($number) = $string =~ /\*(\d+)\*eval\*/; 

$numberは未定義になり、それ以外の場合はされます"*""*eval*"の間に数字が含まれています。何が価値があるために

+0

パーフェクト、ありがとう! – Roger

+0

私はその入力を '*'に分割し、部分文字列番号に基づいて解析します。ハックが少なく、より堅牢です。 – kevlar1818

1
if ($str =~ /\*(\d+)\*/) { 
    print $1; 
} 
0

、私は、これは、より堅牢な答えだと思う:

while(<STDIN>) 
{ 
    @fields = split(/\*/,$1) if(/(?<=>)([^<>])+(?><)/); 
    print "$fields[1]\n"; 
} 

これは、あなたがそれらを必要とする場合は、あなたのすべてのフィールドへのアクセスを可能にし、固有の順序に依存しません。特定のフィールドを解析します。

whileループは、必要な行単位の繰り返しに置き換えてください。しかし、テストするには、これをPerlスクリプトとして実行し、[48:31.8] Sent: >33*1311875297587*eval*0*frame[0]*"A"<などの行に貼り付けてください。

1
my ($num) = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/; 
print $num; 
関連する問題