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;