perl - 在 Perl 中解析垂直分隔的文件

标签 perl parsing

我有一个看起来像这样的文件:

*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/

相关文章:

mysql - 加速 perl DBI fetchrow_hashref

perl - 在 fork 里失去 child

perl - 使用 perlbrew 和 dist zilla 测试

parsing - 如何像计算器一样解析输入字符串以获取运算符和操作数?

linux - 如何在路径包含空格的文件上使用 `diff`

perl - 如何控制 Perl 6 中循环的嵌套性?

python - 在某些情况下,汤很美味,但在其他情况下则不然。为什么?

c - 由于包含好文件而导致的解析错误

c++ - C++中的前缀递归表示法

Java SimpleDateFormat 解析错误的日期