【问题标题】:How to retrieve hash value from session in Perl如何从 Perl 中的会话中检索哈希值
【发布时间】:2018-02-23 09:19:34
【问题描述】:

我在会话中存储一个哈希。我正在尝试从会话中检索值,但没有成功。我想遍历会话中的哈希值以生成一个选择框。下面是会话值

$VAR1 = {
          'userDetails' => {
                           'roles' => [
                                      {
                                        'ln' => 'asdf',
                                        'email' => 'test@example.com',
                                        'session_id' => '14',
                                        'is_active' => '0',
                                        'role' => 'ndfbfd',
                                        'facility_name' => 'jjjj',
                                        'fn' => 'yyyyyy'
                                      },
                                      {
                                        'ln' => 'asdf',
                                        'email' => 'test@example.com',
                                        'session_id' => '15',
                                        'is_active' => '1',
                                        'role' => 'ndfbfd',
                                        'facility_name' => 'fbhsdf',
                                        'fn' => 'yyyyyy'
                                      },
                                      {
                                        'ln' => 'asdf',
                                        'email' => 'test@example.com',
                                        'session_id' => '16',
                                        'is_active' => '1',
                                        'role' => 'ndfbfd',
                                        'facility_name' => 'mvsd',
                                        'fn' => 'yyyyyy'
                                      },
                                      {
                                        'ln' => 'asdf',
                                        'email' => 'test@example.com',
                                        'session_id' => '17',
                                        'is_active' => '1',
                                        'role' => 'bdfgre',
                                        'facility_name' => 'jjjj',
                                        'fn' => 'yyyyyy'
                                      },
                                      {
                                        'ln' => 'asdf',
                                        'email' => 'test@example.com',
                                        'session_id' => '18',
                                        'is_active' => '0',
                                        'role' => 'gderere',
                                        'facility_name' => 'jjjj',
                                        'fn' => 'yyyyyy'
                                      }
                                    ],
                           'ln' => 'asdf',
                           'logged_in' => '1',
                           'fn' => 'yyyyyy'
                         },
          'logged_in' => '1',
          'username' => 'test@example.com'
        };

我正在尝试从会话中检索角色

my %userDetails = $self->session('userDetails');
my %roles = $userDetails{'roles'};
foreach my $family ( keys %roles ) {
    print "$family: { ";
    for my $role ( keys %{ $HoH{$family} } ) {
        print "$role=$HoH{$family}{$role} ";
    }
    print "}\n";
}

显示两个错误。

Reference found where even-sized list expected.
Odd number of elements in hash assignment.

当我将代码 my %userDetails = $self->session('userDetails'); 更改为 my %userDetails = \$self->session('userDetails'); 时出现错误

Odd number of elements in hash assignment.
Odd number of elements in hash assignment.

【问题讨论】:

  • 您的代码似乎与您显示的数据完全无关,我看不出它如何产生您所说的错误。 $self->session('userDetails') 返回一个哈希引用,而不是一个哈希,roles 是一个数组,而不是一个哈希。您的数据中没有提到family,并且您从不声明或定义%HoH(无论如何这是一个变量的惰性名称)。
  • 只是一个变量名。我刚刚从某个地方复制了 foreach 代码。问题在于行my %userDetails = $self->session('userDetails'); my %roles = $userDetails{'roles'};
  • 你不能通过“从某处复制代码”来编写工作代码。你显然不知道你在写什么。
  • 我确实知道我在写什么。我是一名尝试学习 Perl 的 PHP 程序员。

标签: perl mojolicious strawberry-perl


【解决方案1】:

胡乱猜测

my %userDetails = %{$self->session('userDetails')};
my @roles = @{$userDetails{'roles'}};
require Data::Dumper;
foreach my $family ( @roles ) {
    print Data::Dumper::Dumper($family);
}

在你的例子中

'角色' => [

所以这表明角色属性下面的值是一个数组引用。

$self->session('userDetails')

可能是哈希,或者更可能是哈希引用。我猜是后者。所以如果你有一个“元素”的引用,你首先要取消它。见perldoc perlref

【讨论】:

  • 非常感谢。当 SO 是为了互相帮助时,不知道为什么要投反对票。
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 2012-09-14
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多