在Perl中解析结构化文本文件

MAR*_*ARS 3 perl

我是Perl的新手,我在编写一个能够成功解析结构化文本文件的Perl脚本时遇到了极大的困难.

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

name:
    John Smith
occupation:
    Electrician
date of birth:
    2/6/1961
hobbies:
    Boating
    Camping
    Fishing
Run Code Online (Sandbox Code Playgroud)

等等.字段名后面跟一个冒号,与这些字段关联的所有数据总是由一个选项卡缩进(\ t).

我想创建一个将字段内容与字段名称直接关联的哈希,如下所示:

 $contents{$name} = "John Smith"
 $contents{$hobbies} = "Boating, Camping, Fishing"
Run Code Online (Sandbox Code Playgroud)

或类似的规定.

到目前为止,我已经能够将所有字段名称自己变为哈希,但是我没有任何运气将字段数据转换成可以很好地存储在哈希中的表单.显然,替换/拆分新行后跟选项卡是行不通的(我试过,有点天真).我还尝试了一个粗略的前瞻,我从文件中创建了一个重复的行数组,并使用它来确定字段边界的位置,但它在内存消耗方面并不是那么好.

FWIW,目前我正在逐行浏览文件,但我并不完全相信这是最好的解决方案.有没有办法以简单的方式进行解析?

hma*_*tt1 5

逐行读取文件是一个很好的方法.这里我创建了一个数组引用的哈希.这就是你如何阅读一个文件.您可以通过这种方式读取每个文件,并将数组的哈希值放入数组哈希值的哈希值中.

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %contents;
my $key;
while(<DATA>){
    chomp;
    if ( s/:\s*$// ) {
        $key = $_;
    } else {
        s/^\s+//g; # remove extra whitespace
        push @{$contents{$key}}, $_;
    }
}
print Dumper \%contents;

__DATA__
name:
    John Smith
occupation:
    Electrician
date of birth:
    2/6/1961
hobbies:
    Boating
    Camping
    Fishing
Run Code Online (Sandbox Code Playgroud)

输出:

$VAR1 = {
          'occupation' => [
                             'Electrician'
                           ],
          'hobbies' => [
                          'Boating',
                          'Camping',
                          'Fishing'
                        ],
          'name' => [
                       'JohnSmith'
                     ],
          'date of birth' => [
                                '2/6/1961'
                              ]
        };
Run Code Online (Sandbox Code Playgroud)

  • 可能最好不要用`s /\s + // g删除所有额外的空格;` - 它在名字中很有用!`)` (2认同)
  • @ialarmedalien看起来像米勒将其更新为领先的空白.绝对搞砸名字,好打电话.只是想在那里扔东西以显示你可以在需要时对元素进行处理的地方! (2认同)