我有一个这样的perl代码:
use constant OPERATING_MODE_MAIN_ADMIN => 'super_admin';
use constant OPERATING_MODE_ADMIN => 'admin';
use constant OPERATING_MODE_USER => 'user';
sub system_details
{
return {
operating_modes => {
values => [OPERATING_MODE_MAIN_ADMIN, OPERATING_MODE_ADMIN, OPERATING_MODE_USER],
help => {
'super_admin' => 'The system displays the settings for super admin',
'admin' => 'The system displays settings for normal admin',
'user' => 'No settings are displayed. Only user level pages.'
}
},
log_level => {
values => [qw(FATAL ERROR WARN INFO DEBUG TRACE)],
help => "http://search.cpan.org/~mschilli/Log-Log4perl-1.49/lib/Log/Log4perl.pm#Log_Levels"
},
};
}
如何从另一个子例程访问每个键的"值"字段和"帮助"字段?假设我想要单独operating_mode的值还是单独log_level值?
system_details()
返回一个 hashref,它有两个键,值是 hashref。因此,您可以取消引用 sub 的返回并赋值到哈希中,然后提取所需的内容
my %sys = %{ system_details() };
my @loglevel_vals = @{ $sys{log_level}->{values} };
my $help_msg = $sys{log_level}->{help};
@loglevel_vals
数组包含FATAL
、ERROR
等,而$help_msg
包含消息字符串。
这制作了一个额外的哈希副本,同时可以使用引用,如 doimen 的答案
my $sys = system_details();
my @loglevel_vals = @{ $sys->{log_level}->{values} };
但是,由于目的是在另一个子中查询数据,因此使用本地副本也是有意义的,这通常更安全(防止意外更改调用者中的数据(。
有一些模块可以通过显示它们来帮助破译复杂的数据结构。 这有助于设计处理数据的方法。经常引用的是Data::D umper,它不仅仅是显示数据。 其他一些旨在简单地显示数据。几个不错的是Data::D ump和Data::P rinter。
my $sys = system_details;
my $log_level = $sys->{'log_level'};
my @values = @{ $log_level->{'values'} };
my $help = $log_level->{'help'};
如果需要内省 help 中存储的结构类型(例如,help
中的operating_mode
是哈希,但在log_level
中是字符串(,请使用内置 funcref
。