【问题标题】:How to have a perl variable act as a hash and an object?如何让 perl 变量充当散列和对象?
【发布时间】:2014-12-05 00:59:36
【问题描述】:

在 perl 中,我正在尝试创建一个变量 $foo,我可以在该变量上执行以下两项操作:

$foo->getBirthday();     # (A)
$foo->{'name'};          # (B)

我该怎么做?

我知道如果我创建一个 perl 对象,那么我可以有一个 getBirthday 子例程,但如果我这样做了;我怎样才能使用->{'name'} 语法呢?同样,如果我创建一个基本的 perl 哈希引用,那么我可以做 B,但我不知道我将如何完成 A。

谁能告诉我如何创建一个允许这两种语法的数据结构/对象?

我很确定这在某种程度上是合法的,因为我在其他人的代码中看到了它。 (不幸的是,我无法查看他们的源代码或运行他们的程序)

【问题讨论】:

  • 我的 perl 生锈了,但我想说'不可能'
  • 我不确定perl 是否遵循everything is an object 成语,就像ruby 一样。
  • 我很确定这在某种程度上是合法的,因为我在其他人的代码中看到了它。 (不幸的是,我无法查看他们的源代码或运行他们的程序)
  • 这很好,如果你从散列引用形成你的对象,那么它就是这样发生的。但是,如果您直接访问散列的内容,则您违反了一些规则,您应该编写访问器。

标签: perl


【解决方案1】:

如果你的对象是一个祝福的哈希引用,它仍然是一个哈希引用。您可以(尽管可以说不应该)像通常访问哈希一样访问其元素:

use warnings;
use strict;
use 5.010;

package Foo;

sub new {
  my $class = shift;
  my $hashref = {
    name => 'bob',
    dob  => '1985-01-01',
  };
  return bless $hashref, $class;
}

sub getBirthday {
  my $self = shift;
  return $self->{dob};
}

package main;

my $f = Foo->new;
say $f->getBirthday;
say $f->{name};

【讨论】:

  • 没错。虽然它是一个具有恒定数据项的奇怪对象!比@{$hashref}{qw/ name dob /} = @_my $f = Foo->new('bob', '1985-01-01') 更好
  • 完美的正是我所需要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多