Perl: получите ключи от благословенного хешрефа

В коде 2 пакета.

Пакет 1:

package Foo;
sub new {
    my ($class, $args) = @_;
    my $hashref = {'a' => 1, 'b' => 2};
    bless ($self, $class);
    return $self;
}

Пакет 2:

package Fuz;
use Foo;
.
.
.
.
my $obj = Foo->new($args);

Как получить ключи от благословенного хешрефа в объекте?

В курсе Acme::Damn а также Data::Structure::Util модули в Perl, чтобы unbless объект. Есть ли другие способы добиться этого?

3 ответа

Благословение ссылки на хеш не меняет того, что это все еще ссылка на хеш. Поэтому вы можете разыменовать его как обычно:

my @keys = keys %$obj;

Во-первых, вы должны use strict а также use warningsпотому что этот код не компилируется как есть. Что такое $self по строке 5? Вы никогда не определяете это. Модифицируя код пакета так:

package Foo;
use strict;
use warnings;
sub new {
    my ($class, $args) = @_;
    my $hashref = {'a' => 1, 'b' => 2};
    bless ($args, $class);
    return $args;
}
1;

Теперь это скомпилируется, но что вы хотите сделать с $hashref? Ожидаете ли вы, что параметры передаются через $args или может $hashref замещать $args? При условии, что $args действительно не нужно, давайте использовать это для Foo:

package Foo;
use strict;
use warnings;
sub new {
    my ($class) = @_;
    my $hashref = {'a' => 1, 'b' => 2};
    bless ($hashref, $class);
    return $hashref;
}
1;

Теперь, когда вы вызываете new, вам будет возвращен благословенный хэш-ключ, от которого вы можете получить ключи:

> perl -d -Ilib -e '1'

Loading DB routines from perl5db.pl version 1.33
Editor support available.

Enter h or `h h' for help, or `perldoc perldebug' for more help.

main::(-e:1):   1
  DB<1> use Foo

  DB<2> $obj = Foo->new()

  DB<3> x $obj
0  Foo=HASH(0x2a16374)
   'a' => 1
   'b' => 2
  DB<4> x keys(%{$obj})
0  'a'
1  'b'
  DB<5>

Вы все еще можете использовать ключи на $obj

my $obj = Foo->new($args);
my @k = keys %$obj;
Другие вопросы по тегам