gpt4 book ai didi

perl - 如何使用 Perl 从文件中读取多行值

转载 作者:行者123 更新时间:2023-12-01 11:49:32 27 4
gpt4 key购买 nike

我有一个属性文件,比方说

##
## Start of property1
##
##
Property1=\
a:b,\
a1:b1,\
a2,b2
##
## Start of propert2
##
Property2=\
c:d,\
c1:d1,\
c2,d2

请注意,任何给定属性的值都可以分成多行。

我想使用 Perl 读取这个属性文件。这在 Java 中运行良好,因为 Java 支持使用反斜杠的多行值,但在 Perl 中这是一场噩梦。

在上面的属性文件中有两个属性 - Property1Property2 - 每个都与一个字符串相关联,我可以根据分隔符将其拆分 ,:

对于给定的属性(比如 Property1 )和给定的列(比如 a1 )我需要返回第二列(这里是 b1 )

代码应该能够忽略注释、空格等

提前致谢

最佳答案

大多数文本处理——包括处理反斜杠续行——在 Perl 中都非常简单。您只需要一个像这样的读取循环。

while (<>) {
$_ .= <> while s/\\\n// and not eof;
}

下面的程序可以满足您的需求。我在读取循环中放置了一个 print 调用,以显示已通过连续行聚合的完整记录。我还演示了如何提取您作为示例提供的 b1 字段,并显示了 Data::Dump 的输出。这样您就可以看到创建的数据结构。

use strict;
use warnings;

my %data;

while (<DATA>) {
next if /^#/;
$_ .= <DATA> while s/\\\n// and not eof;
print;
chomp;
my ($key, $values) = split /=/;
my @values = map [ split /:/ ], split /,/, $values;
$data{$key} = \@values;
}

print $data{Property1}[1][1], "\n\n";

use Data::Dump;
dd \%data;


__DATA__
##
## Start of property1
##
##
Property1=\
a:b,\
a1:b1,\
a2,b2
##
## Start of propert2
##
Property2=\
c:d,\
c1:d1,\
c2,d2

输出

Property1=a:b,a1:b1,a2,b2
Property2=c:d,c1:d1,c2,d2
b1

{
Property1 => [["a", "b"], ["a1", "b1"], ["a2"], ["b2"]],
Property2 => [["c", "d"], ["c1", "d1"], ["c2"], ["d2"]],
}

更新

我已再次阅读您的问题,我认为您可能更喜欢数据的不同表示形式。此变体将属性值保留为哈希而不是数组的数组,否则其行为是相同的

use strict;
use warnings;

my %data;

while (<DATA>) {
next if /^#/;
$_ .= <DATA> while s/\\\n// and not eof;
print;
chomp;
my ($key, $values) = split /=/;
my %values = map { my @kv = split /:/; @kv[0,1] } split /,/, $values;
$data{$key} = \%values;
}

print $data{Property1}{a1}, "\n\n";

use Data::Dump;
dd \%data;

输出

Property1=a:b,a1:b1,a2,b2
Property2=c:d,c1:d1,c2,d2
b1

{
Property1 => { a => "b", a1 => "b1", a2 => undef, b2 => undef },
Property2 => { c => "d", c1 => "d1", c2 => undef, d2 => undef },
}

关于perl - 如何使用 Perl 从文件中读取多行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799907/

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