正则表达式名称和 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
(我事先知道)开头的行的值。然后我知道我将有许多值名称(在玩具示例中 marta
、joe
、ralph
),每个名称后跟一个十进制或十六进制值。
有没有办法在事先不知道它们是十进制还是十六进制的情况下读取这些值?
存储这些值的最佳方式是什么?我想用 marta
、joe
、ralph
的键进行散列,但我可能事先不知道它们,这意味着一旦我阅读了第一行,我就会知道所有这些,之前没有。
我的尝试到此为止
$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" },
]
有一个日志文件my_file.txt
,我知道它具有以下结构:
milk marta 1231 joe 1223 ralph 7C3D
cookie
jam
milk marta 163 joe 23 ralph 7FFF
我想做的是借助 perl 中的正则表达式提取所有以定界符 milk
(我事先知道)开头的行的值。然后我知道我将有许多值名称(在玩具示例中 marta
、joe
、ralph
),每个名称后跟一个十进制或十六进制值。
有没有办法在事先不知道它们是十进制还是十六进制的情况下读取这些值?
存储这些值的最佳方式是什么?我想用
marta
、joe
、ralph
的键进行散列,但我可能事先不知道它们,这意味着一旦我阅读了第一行,我就会知道所有这些,之前没有。
我的尝试到此为止
$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" },
]