gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:56:13 37 4
gpt4 key购买 nike

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

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

name:
John Smith
occupation:
Electrician
date of birth:
2/6/1961
hobbies:
Boating
Camping
Fishing

等等。字段名称始终后跟一个冒号,并且与这些字段关联的所有数据始终以单个制表符 (\t) 缩进。

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

 $contents{$name} = "John Smith"
$contents{$hobbies} = "Boating, Camping, Fishing"

或者类似的东西。

到目前为止,我已经能够自己将所有字段名称放入散列中,但我没有运气将字段数据整理成可以很好地存储在散列中的形式。显然用制表符替换/拆分换行符是行不通的(我试过了,有点天真)。我还尝试了一个粗略的前瞻,我从文件中创建了一个重复的行数组,并使用它来确定字段边界的位置,但它在内存消耗方面并不是那么好。

FWIW,目前我正在逐行查看文件,但我并不完全相信这是最佳解决方案。有什么方法可以直接进行这种解析吗?

最佳答案

逐行读取文件是一个不错的方法。在这里,我正在创建数组引用的散列。这就是您只读取一个文件的方式。您可以通过这种方式读取每个文件,并将数组的散列放入数组散列的散列中。

#!/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

输出:

$VAR1 = {
'occupation' => [
'Electrician'
],
'hobbies' => [
'Boating',
'Camping',
'Fishing'
],
'name' => [
'JohnSmith'
],
'date of birth' => [
'2/6/1961'
]
};

关于perl - 在 Perl 中解析结构化文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26315990/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com