我正在解析一个文件,它的一部分是记录的东西,格式如下:
CategoryA--
5: UserA
6: UserB
7: UserC
CategoryB--
4: UserA
5: UserB
Run Code Online (Sandbox Code Playgroud)
我想将它移动到一个看起来像这样的哈希:
{ UserA => { CategoryA => 5, CategoryB => 4, },
UserB => { CategoryA => 6, CategoryB => 5, },
UserC => { CategoryA => 7, },
}
Run Code Online (Sandbox Code Playgroud)
我如何对此进行正则表达式?
编辑:它不一定纯粹只是正则表达式 - 只是在perl和循环也会很好.
您需要两个正则表达式,一个用于标识新类别,另一个用于解析用户记录.
#!/usr/bin/perl
use strict;
use warnings;
my %users;
my $cur;
while (<DATA>) {
if (my ($category) = /^(.*)--$/) {
$cur = $category;
next;
}
next unless my ($id, $user) = /([0-9]+): (\w+)/;
die "no category found" unless defined $cur;
$users{$user}{$cur} = $id;
}
use Data::Dumper;
print Dumper \%users;
__DATA__
CategoryA--
5: UserA
6: UserB
7: UserC
CategoryB--
4: UserA
5: UserB
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用Perl 5.10或更高版本,则可以将命名捕获与一个正则表达式一起使用:
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my %users;
my $cur;
while (<DATA>) {
next unless /^(?:(?<category>.*)--|(?<id>[0-9]+): (?<user>\w+))$/;
if (exists $+{category}) {
$cur = $+{category};
next;
}
die "no category found" unless defined $cur;
$users{$+{user}}{$cur} = $+{id};
}
use Data::Dumper;
print Dumper \%users;
__DATA__
CategoryA--
5: UserA
6: UserB
7: UserC
CategoryB--
4: UserA
5: UserB
Run Code Online (Sandbox Code Playgroud)