如何获取在 Perl 子例程中硬编码的值?



我有一个这样的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数组包含FATALERROR等,而$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

最新更新