-1

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

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

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

  • 有没有办法在事先不知道它们是十进制还是十六进制的情况下读取这些值?

  • 存储此值的最佳方法是什么?我想用 , , 的键来做一个哈希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
    }
}
4

2 回答 2

2

除了确定数字字符串是十进制还是十六进制的问题之外,类似这样的内容将提取您需要的文本

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" },
]
于 2016-08-30T15:15:36.463 回答
1

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

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

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

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

于 2016-08-30T14:54:53.970 回答