2016-12-29 47 views
0

我已经写了一个函数,通过包含一个有序的键数组作为哈希的元素来按照规定的顺序打印哈希。在perl中,我怎样才能在父散列中引用散列元素?

由于可能有许多具有相同顺序的子哈希,我希望能够将顺序字符串放在父哈希中,并在每个子哈希中引用它。 我无法让它工作,如下面的代码片段所示。

有没有办法做到这一点?

$hr={ 
    Order => [qw(Sp Ls)], 
    OrderSP => [qw(a b)], 
    Sp => { 
     a =>-1, 
     b => -1, 
     Order => @{$hr->{OrderSP}} 
     }, 
    Ls => { 
     c => -1, 
     d => -1, 
     Order => [qw(c d)] 
     } 
    }; 
print "\n\@{\$hr->{OrderSP}} = ",@{$hr->{OrderSP}}; # ab 
print "\n\@{\$hr->{Ls}->{Order}} = ",@{$hr->{Ls}->{Order}}; # cd 
print "\n\@{\$hr->{Sp}->{Order}} = ",@{$hr->{Sp}->{Order}}; # blank 

Result: 
@{$hr->{OrderSP}} = ab 
@{$hr->{Ls}->{Order}} = cd 
@{$hr->{Sp}->{Order}} = 
+0

尝试把周围的括号'@ {$ hr - > {OrderSP}}':'Order => [@ {$ hr - > {OrderSP}}]' –

+0

这看起来很像您已经解析过的东西 - 也许是一些带有XML :: Simple的XML?如果是这样,那么可能有更好的方法来解决这个问题。 – Sobrique

回答

3

是的,有一种方法可以做到这一点。

你的代码有两个问题:

  1. 你解引用存储在父的数组引用:@{$hr->{OrderSP}}。这没有意义,因为散列中的值必须是单个标量,而不是列表。删除@{}会解决这个问题。
  2. 最重要的一点:您正尝试使用尚不存在的数据结构。虽然正在评估作业的右侧(并且构建了哈希,子哈希等),但尚未触及$hr。实际分配只发生在数据结构建立后。

这里有一个工作示例:

use strict; 
use warnings; 

my $hr = { 
    Order => [qw(Sp Ls)], 
    OrderSP => [qw(a b)], 
    Sp => { 
     a => -1, 
     b => -1, 
    }, 
    Ls => { 
     c => -1, 
     d => -1, 
     Order => [qw(c d)], 
    }, 
}; 

$hr->{Sp}{Order} = $hr->{OrderSP}; 

print "\@{\$hr->{OrderSP}} = @{$hr->{OrderSP}}\n"; 
print "\@{\$hr->{Ls}->{Order}} = @{$hr->{Ls}->{Order}}\n"; 
print "\@{\$hr->{Sp}->{Order}} = @{$hr->{Sp}->{Order}}\n"; 

输出:

@{$hr->{OrderSP}} = a b 
@{$hr->{Ls}->{Order}} = c d 
@{$hr->{Sp}->{Order}} = a b 

关键的一点是,设置$hr->{Sp}{Order}已经拆分为独立的步骤,所以它只发生$hr->{OrderSP}有后已创建(分配到my $hr)。

或者你也可以这样做:

my $OrderSP = [qw(a b)]; 
my $hr = { 
    Order => [qw(Sp Ls)], 
    OrderSP => $OrderSP, 
    Sp => { 
     a => -1, 
     b => -1, 
     Order => $OrderSP, 
    }, 
    Ls => { 
     c => -1, 
     d => -1, 
     Order => [qw(c d)], 
    }, 
}; 

这一次,我们的初始分配后不修改$hr。相反,我们事先将OrderSP存储在一个单独的变量中,然后我们可以从任何地方引用它。

(顺便说一句,我也固定换行符在输出"\n"是线终止;即它会在每一行,而不是开始的结束。)

+0

感谢您的帮助!你的第一个例子是我最初做的。但是这些Order阵列又大又重复,这就是为什么我试图让它们都指向一个地方。你的第二个例子当然可以解决这个问题,但我希望能够使得哈希自成一体,所以我可以简单地用printOrderedHash函数来调用它。所以,我想这是一个美学问题。 – user1067305