【发布时间】:2017-11-02 08:25:48
【问题描述】:
一般来说,perl 对象是散列、数组、标量、文件句柄等数据结构。
我正在考虑一种情况,即 perl 模块可以将对象的散列(每个对象作为散列)作为单个对象返回。请考虑以下情况。
我有一个包含多个文档的 YAML 文件。 (或具有多组相同配置节点的 XML)。我需要一个 perl 模块,我可以将这个 YAML 文件作为输入传递,并接收对象的散列(每个对象对应于 YAML 文件中的一个文档)。
YAML
---
mykey: 1
myname: John
---
mykey: 2
myname: Doe
----
mykey: 3
myname: Chris
...
上面的 YAML 文件中有 3 个文档。让我们考虑这将是输入文件。
我想写一些类似下面的东西并访问对象的哈希。
SimpleParser.pl
use strict;
use warnings;
use YAMLParser;
my %objHashRef = YAMLParser->new('input.yml');
print keys %objHashRef; #print keys for each objects
print values %objHashRef; #print hash reference of each object
my $thirdObjectName = $objHashRef{3}->get_name();
print $thirdObjectName; #this prints 'Chris'
要实现这种行为,需要在 perl 模块文件中进行哪些修改,类似于以下内容?
YAMLParser.pm
use strict;
use warnings;
sub new {
my ($class) = shift;
my $self = {
inputFile => shift,
name => shift
};
bless $self, $class;
return $self;
}
sub set_name {
$self->{name} = $name;
}
sub get_name {
my ($self) = @_;
return $self->{name};
}
1;
下面是一个示例 YAML 解析 sn-p,如果需要,可以提供帮助。
my @list;
my $myname;
my $i = 0;
my @conf = LoadFile('input.yml'); #returns array of reference to each document in the YAML file
my $config = \@conf; #Returns reference to an array
foreach ( @conf ) {
$list[$i] = $config->[$i]->{mykey};
$objHash{$list[$i]} = YAMLParser->new();
$myname = $config->[$i]->{myname};
$objHash{$list[$i]}->setMyname($myname);
my $host = $objHash{$list[$i]}->getMyname();
$i++;
}
请告诉我你的想法。
【问题讨论】:
-
为了澄清您的问题,您想知道如何从您的
new方法返回哈希而不是哈希引用? -
不,我隐含的意思是 hashref 指向对象的散列,而不是 hashref 指向散列。现在清除吗?
-
不太清楚...最后一个sn-p代码有什么问题?那就是构建一个包含对象的哈希。