一般来说,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 解析片段,如果需要的话可以提供帮助。
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
键控的哈希中即可。我用过map ,但 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 的对象。
关于Perl - 将对象的哈希值作为类中的单个对象返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47070626/