用于捕获值的正则表达式-Perl

用于捕获值的正则表达式-Perl,perl,Perl,我正在编写一个解析器,它将从文本文件中捕获值。除了两个值之外,我能够捕获所有值 有人能帮我也得到这两个值吗 这是我的密码: 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>

我正在编写一个解析器,它将从文本文件中捕获值。除了两个值之外,我能够捕获所有值

有人能帮我也得到这两个值吗

这是我的密码:

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";
    }
}
谁能帮我从日志中获取
ADDR0
值和
PCNOC_9
? 如果您在这里保留了不清楚的补偿,请告诉我。

您可以试试这个

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

请尝试此操作,它将使抓取完全动态

while (defined(my $line = <$fh>)) {
      if($line =~ /(PCNOC\_.*?\d+)\s*(\w+):\s*(.*)/i){
            print "$1 ==> $2 ==> $3\n";
      }
}
while(已定义(my$line=)){
如果($line=~/(PCNOC\\\.*?\d+)\s*(\w+):\s*(.*)/i){
打印“$1==>2==>3\n”;
}
}
这无法匹配,因为
不是单词字符。修正:

/ADDR0:\s*(.*)/

虽然该代码可以回答该问题,但提供关于为什么和/或如何回答该问题的额外上下文将显著提高其长期价值。请在您的回答中添加一些解释。
/ADDR0:\s*(.*)/