我有一个看起来像这样的文件:
*NEWRECORD
RECTYPE = D
MH = Calcimycin
AQ = AA
MED = *62
*NEWRECORD
RECTYPE = D
MH = Urinary Bladder
AQ = AB AH BS CH CY DE EM EN GD IM IN IR ME MI PA PH PP PS RA RE RI SE SU TR UL US VI
CX = consider also terms at CYST- and VESIC-
MED = *1359
每个记录 block 都有不同的行数(例如,CX
条目并不总是存在)。
但如果 CX
存在,则仅显示为 1 个条目。
我们想得到一个以“MH”为键,以“CX”为值的哈希。
因此解析上述数据我们希望得到这样的结构:
$VAR = { "Urinary Bladder" => ["CYST-" , "VESIC-"]};
解析它的正确方法是什么?
我受困于此,它没有给我想要的结果。
use Data::Dumper;
my %bighash;
my $key = "";
my $cx = "";
while (<>) {
chomp;
if (/^MH = (\w+/)) {
$key = $1;
push @{$bighash{$key}}, " ";
}
elsif ( /^CX = (\w+/)) {
$cx = $1;
}
else {
push @{$bighash{$key}}, $cx;
}
}
最佳答案
如果您使用$/
一次读取一段数据,这会变得更简单。令我惊讶的是,没有其他人这样建议。
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my %bighash;
$/ = '';
while (<DATA>) {
if (my ($k) = /^MH = (.*?)$/m and my ($v) = /^CX = (.*?)$/m) {
$bighash{$k} = [ $v =~ /([A-Z]+-)/g ];
}
}
say Dumper \%bighash;
__DATA__
*NEWRECORD
RECTYPE = D
MH = Calcimycin
AQ = AA
MED = *62
*NEWRECORD
RECTYPE = D
MH = Urinary Bladder
AQ = AB AH BS CH CY DE EM EN GD IM IN IR ME MI PA PH PP PS RA RE RI SE SU TR UL US VI
CX = consider also terms at CYST- and VESIC-
MED = *1359
输出看起来像这样:
$VAR1 = {
'Urinary Bladder' => [
'CYST-',
'VESIC-'
]
};
关于perl - 在 Perl 中解析垂直分隔的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8164291/