正则表达式名称和 numbers/hexes 交替的文件

Regex a file with names and numbers/hexes alternated

有一个日志文件my_file.txt,我知道它具有以下结构:

milk marta 1231 joe 1223 ralph 7C3D
cookie
jam
milk marta 163 joe 23 ralph 7FFF

我想做的是借助 perl 中的正则表达式提取所有以定界符 milk(我事先知道)开头的行的值。然后我知道我将有许多值名称(在玩具示例中 martajoeralph),每个名称后跟一个十进制或十六进制值。

我的尝试到此为止

$my_file = "my_file.txt"
open my $fh, $my_file or die "Nope!"

while (my $line = <$fh>)
{
    if ($line =~ m/milk/)
    {
        # here iterate with a for or while loop over the $line
        # and read word and value
    }
}

好的,我会做的是这样的:

if ($line =~ /^milk/) {
    my %names = ($line =~ /(\w+)\s+([a-f\d]+)/gi);

    use Data::Dumper;
    print Dumper \%names;
}

它会做的是首先确保该行以 milk 开头,然后抓取该行中的每一对单个单词和十六进制数并将每一对转储到一个数组中。

除了确定数字字符串是十进制还是十六进制的问题,像这样的东西将提取您需要的文本

use strict;
use warnings 'all';

use Data::Dump 'dd';

my @data;

while ( <DATA> ) {
    my ($col1, %item) = split;
    push @data, \%item if $col1 eq 'milk';
}

dd \@data;

__DATA__
milk marta 1231 joe 1223 ralph 7C3D
cookie
jam
milk marta 163 joe 23 ralph 7FFF

输出

[
  { joe => 1223, marta => 1231, ralph => "7C3D" },
  { joe => 23, marta => 163, ralph => "7FFF" },
]