2016-04-05 19 views
-1

Metin dosyasından değeri yakalayacak bir çözümleyici yazıyorum. İki değerden ayrı olarak tüm değerleri yakalayabiliyorum.Değerleri yakalamak için düzenli ifade - Perl

Bu iki değeri de elde etmek için bana yardımcı olabilir misiniz?

use warnings; 

open(my $fh, "<", "$tZPath\\Diag.txt") || print "can't open file filename : $!\n"; 

my ($aBT_Slave, $iD, $hready, $address); 

while (defined(my $line = <$fh>)) { 

    if ($line =~ /ID\:\s*(.+?\W+)/i) { 
     $iD = $1; 
     print " Id -> $iD \n"; 
    } 
    elsif ($line =~ /HREADY\:\s*(.+?\W+)/i) { 
     $hready = $1; 
     print " hready -> $hready \n"; 
    } 
    elsif ($line =~ /ADDR0\w\s*(.+?\W+)/i) { 
     $address = $1; 
     print " address -> $address \n"; 
    } 
    elsif ($line =~ /PCNOC\_(.*?\d+)/i) { 
     $aBT_Slave = "PCNOC_" . $1; 
     print " aBT_Slave -> $aBT_Slave \n"; 
    } 
} 

Günlüğü dosya içeriği::

ABT PCNOC_9 ID: 0x0000430c 
ABT PCNOC_9 ADDR0: 0x000000e0 
ABT PCNOC_9 ADDR1: 0x00000000 
ABT PCNOC_9 HREADY: 0xfffffffd 
ABT PCNOC_9 Slaves: 5 
Fatal Error: AHB_TIMEOUT 

kimse günlüğünden ADDR0 değeri ve PCNOC_9 almak için bana yardım edebilir İşte

benim kodudur? Lütfen açıklamayın açıklamaması durumunda lütfen bildirin.

cevap

1

Lütfen bunu deneyin, Tam anlamıyla dinamik hale getirecektir.

while (defined(my $line = <$fh>)) { 
     if($line =~ /(PCNOC\_.*?\d+)\s*(\w+):\s*(.*)/i){ 
      print "$1 ==> $2 ==> $3\n"; 
     } 
} 
0

Bunu deneyebilirsiniz.

if($line =~ /ADDR1:\s*(.*)/i){ 
..... 
} 
elsif($line =~ /ADDR0:\s*(.*)/i){ 
..... 
} 
+0

iken _why_ ilgili ek bağlam sağlayan ve/veya soru önemli ölçüde uzun vadeli değerini artıracak cevaplar _how_: sabitleyin. Lütfen bazı açıklama eklemek için cevabınızı [düzenleyin]. –

0
/ADDR0\w\s*(.+?\W+)/i 
     ^^ 

Bu : bir kelime karakter olmadığı için maç için başarısız olur. Bu kod soruya cevap verebilir

/ADDR0:\s*(.*)/