Perl-将对象哈希作为类中的单个对象返回
通常,perl对象是数据结构,如哈希、数组、标量、文件句柄等 我正在考虑一个场景,perl模块可以将对象的散列(每个对象都是散列)作为单个对象返回。请考虑以下情况: 我有一个包含多个文档的YAML文件。(或具有多组相同配置节点的XML)。我需要一个perl模块,我可以将这个YAML文件作为输入传递给它,并接收对象的散列(每个对象对应于YAML文件中的一个文档) YAMLPerl-将对象哈希作为类中的单个对象返回,perl,oop,object,hashmap,Perl,Oop,Object,Hashmap,通常,perl对象是数据结构,如哈希、数组、标量、文件句柄等 我正在考虑一个场景,perl模块可以将对象的散列(每个对象都是散列)作为单个对象返回。请考虑以下情况: 我有一个包含多个文档的YAML文件。(或具有多组相同配置节点的XML)。我需要一个perl模块,我可以将这个YAML文件作为输入传递给它,并接收对象的散列(每个对象对应于YAML文件中的一个文档) YAML --- mykey: 1 myname: John --- mykey: 2 myname: Doe ---- mykey:
---
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解析片段示例,如果需要,它可能会有所帮助
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++;
}
请让我知道您的想法。只需将结构存储到由其
mykey
键入的哈希中即可。我使用了,但也可以使用for循环:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
{
package YAMLHash;
use YAML qw{ LoadFile };
sub new {
my ($class, $file) = @_;
my %hash = map { $_->{mykey} => $_ } LoadFile($file);
bless \%hash, $class
}
}
my $obj = 'YAMLHash'->new('1.yaml');
say keys %$obj;
say values %$obj;
my $third_object_name = $obj->{3}{myname};
print $third_object_name; #this prints 'Chris'
请注意,
$obj->{3}
不是第三个对象。它的mykey
是3的对象。有许多模块,它们可以很高兴地从散列中创建一个对象(见鬼,我甚至写了一个:)。如果希望递归地将对象范例应用于YAML文档的嵌套部分,我最喜欢的是。有关类似模块的更全面列表,请参阅
这里有一些代码。它返回一个对象列表,而不是一个对象散列,但是修复它非常简单
use 5.010;
use strict;
use warnings;
use Hash::AsObject;
use YAML 'Load';
my $yaml = do { local $/ = undef;
<DATA>
};
my @objs = map { Hash::AsObject->new( $_ ) } Load( $yaml );
say " Name: ", $objs[0]->myname;
$objs[0]->myname( "Frank" );
say " Name: ", $objs[0]->myname;
__DATA__
---
mykey: 1
myname: John
---
mykey: 2
myname: Doe
---
mykey: 3
myname: Chris
为了澄清您的问题,您想知道如何从
new
方法返回hashref而不是hashref吗?不,我的意思是hashref是对象的哈希,而不是hashref是哈希。现在清楚了吗?不是很清楚…最后一段代码有什么问题?这就是构建包含对象的哈希。
Name: John
Name::Frank