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

标签 perl oop object hashmap

一般来说,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/

相关文章:

java - 在界面中使用抽象关键字

c++ - 我的逻辑有什么问题?我的 Vector 或对象不会 push_back 新对象。保持大小为 0

java - 当我从另一个类调用对象时出现错误,即 "cannot find symbol"

bash - 在 bash 脚本中逐行读写

perl - 如何在Elasticsearch中排序 “sum of 3 properties”?

linux - Perl 系统返回代码 65280 并成功

java - 通用接口(interface)的多种实现

java - Java 中的通配符不适用于 Spark cogroup 函数

c++ - 对象集的排序不正确

java - Perl 与 Java 中的多线程