Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl-将对象哈希作为类中的单个对象返回_Perl_Oop_Object_Hashmap - Fatal编程技术网

Perl-将对象哈希作为类中的单个对象返回

Perl-将对象哈希作为类中的单个对象返回,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:

通常,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
键入的哈希中即可。我使用了,但也可以使用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