【发布时间】:2021-07-11 12:18:26
【问题描述】:
我正在尝试按照我创建它的确切顺序遍历 Perl 中的多维哈希。我正在使用 Hash::Ordered,但无法让它工作。
如果我使用 Data::Dumper 打印 $MENU_ITEMS,我会看到我期望的哈希元素(见下文),但是,当我尝试将它们摄取到 $ITEM 中时,它是空白的。
我确定我在做一些愚蠢的事情,请帮助:)
use Hash::Ordered;
$MENU_SECTIONS = Hash::Ordered->new
(
'MENU_manage_properties' =>
{
'show_current_properties' => 'Current Properties',
'show_prospect_properties' => 'Prospect Properties'
},
'MENU_reports' =>
{
'some_report' => 'Some report',
'another_report' => 'Another report'
},
'MENU_settings' =>
{
'settings_here' => 'Settings',
'more_settings' => 'More Settings'
}
);
%MENU_SECTIONS_HTML = ();
use Data::Dumper;
print header();
$menu_iterator = $MENU_SECTIONS->iterator;
while( (my $MENU_SECTION, my $MENU_ITEMS) = $menu_iterator->() ) 5
{
print "<hr>my $MENU_SECTION, my $MENU_ITEMS<br>";
print "Dumper print of MENU_ITEMS:<br>";
print Dumper $MENU_ITEMS;
print "<br><br>";
my $ITEM = Hash::Ordered->new(@MENU_ITEMS);
$item_iterator = $ITEM->iterator;
print "Dumper print of ITEM:<br>";
print Dumper $ITEM;
print "<br><br>";
print "Dumper print of item_iterator:<br>";
print Dumper $item_iterator;
print "<br><br>";
while( (my $OPERATION, my $TITLE) = $item_iterator->() )
{
print "my $OPERATION, my $TITLE<be>";
}
}
我得到的输出:
my MENU_manage_properties, my HASH(0x43a21f0)
Dumper print of MENU_ITEMS:
$VAR1 = { 'show_current_properties' => 'Current Properties', 'show_prospect_properties' => 'Prospect Properties' };
Dumper print of ITEM:
$VAR1 = bless( [ {}, [], undef, 0, 0 ], 'Hash::Ordered' );
Dumper print of item_iterator:
$VAR1 = sub { "DUMMY" };
my MENU_tenants, my HASH(0x4397b80)
Dumper print of MENU_ITEMS:
$VAR1 = { 'show_current_tenants' => 'Current Tenants', 'show_prospect_tenants' => 'Prospect Tenants' };
Dumper print of ITEM:
$VAR1 = bless( [ {}, [], undef, 0, 0 ], 'Hash::Ordered' );
Dumper print of item_iterator:
$VAR1 = sub { "DUMMY" };
my MENU_buyers, my HASH(0x4317590)
Dumper print of MENU_ITEMS:
$VAR1 = { 'show_prospect_buyers' => 'Prospect Buyers', 'show_current_buyers' => 'Current Buyers' };
Dumper print of ITEM:
$VAR1 = bless( [ {}, [], undef, 0, 0 ], 'Hash::Ordered' );
Dumper print of item_iterator:
$VAR1 = sub { "DUMMY" };
my MENU_reports, my HASH(0x43175f0)
Dumper print of MENU_ITEMS:
$VAR1 = { 'some_report' => 'Some report', 'another_report' => 'Another report' };
Dumper print of ITEM:
$VAR1 = bless( [ {}, [], undef, 0, 0 ], 'Hash::Ordered' );
Dumper print of item_iterator:
$VAR1 = sub { "DUMMY" };
my MENU_settings, my HASH(0x4317650)
Dumper print of MENU_ITEMS:
$VAR1 = { 'more_settings' => 'More Settings', 'settings_here' => 'Settings' };
Dumper print of ITEM:
$VAR1 = bless( [ {}, [], undef, 0, 0 ], 'Hash::Ordered' );
Dumper print of item_iterator:
$VAR1 = sub { "DUMMY" };
【问题讨论】:
-
总是
use strict; use warnings。总是。你写了@MENU_ITEMS而不是@$MENU_ITEMS;strict会警告你的。 -
对,
$MENU_ITEMS不是数组引用,而是哈希引用。我不知道你想用它做什么,但你应该知道。无论如何,@MENU_ITEMS不是一个存在的变量,因此您应该看到您的代码有问题。可能是%$MENU_ITEMS。 -
(尽管将无序散列转换为有序散列可能没有多大意义)
-
那是因为您使用
{ ... }创建了哈希,而您应该在第一个Hash::Ordered->new中使用Hash::Ordered->new。 -
我想知道你是否不应该使用数组而不是哈希。