Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/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 - Fatal编程技术网

如何让perl变量充当哈希和对象?

如何让perl变量充当哈希和对象?,perl,Perl,在perl中,我试图创建一个变量$foo,我可以在该变量上执行以下两项操作: $foo->getBirthday(); # (A) $foo->{'name'}; # (B) 我该怎么做 我知道如果我创建一个perl对象,那么我就可以有一个GetBirth子例程,但是如果我这样做了;如何使用->{'name'}语法?类似地,如果我创建一个基本的perl哈希引用,那么我可以做B,但我不知道如何完成a 有人能告诉我如何创建一个允许这两种语法的数据结构/对象吗

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

$foo->getBirthday();     # (A)
$foo->{'name'};          # (B)
我该怎么做

我知道如果我创建一个perl对象,那么我就可以有一个GetBirth子例程,但是如果我这样做了;如何使用
->{'name'}
语法?类似地,如果我创建一个基本的perl哈希引用,那么我可以做B,但我不知道如何完成a

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


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

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

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};

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

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};

我的perl已经生锈了,但我要说的是‘不可能’。我不确定
perl
是否遵循了
一切都是一个对象
的习惯用法,就像
ruby
那样。我很确定这在某种程度上是合法的,因为我在其他人的代码中看到过它。(不幸的是,我不可能查看它们的源代码或运行它们的程序)这很好,如果您从散列引用形成对象,那么它就是这样发生的。然而,如果你直接访问散列的内容,你就违反了一些规则,你应该改为编写访问器。我的perl已经过时了,但我要说的是“不可能”。我不确定
perl
是否遵循
一切都是像
ruby
那样的对象
习惯用法。我很确定这在某些情况下是合法的时尚,因为我在别人的代码中看到过。(不幸的是,我不可能查看它们的源代码或运行它们的程序)这很好,如果您从散列引用形成对象,那么它就是这样发生的。但是,如果您直接访问散列的内容,您就违反了一些规则,而应该编写访问器。虽然它是一个奇怪的对象,有恒定的数据项!更好的方法是
{$hashref}{qw/name dob/}=@
我的$f=Foo->new('bob','1985-01-01')
完全符合我的需要。谢谢,没错。虽然它是一个奇怪的对象,有恒定的数据项!更好的方法是
{$hashref}{qw/name dob/}=@
我的$f=Foo->new('bob','1985-01-01')
完全符合我的需要。谢谢