2014-02-25 58 views
1

混合哈希我創建這個哈希工作不正常

my %obj_cuentascontables = { 
     '4210' => { 
      'banderamayor' => 'true', 
      'enlace' => 'true', 
      'not_rlike_nombre' => 'DEVOLUCION' 
    }, 
     '4410' => { 
      'banderamayor' => 'true', 
      'enlace' => 'true', 
      'rlike_nombre' => 'DEVOLUCION', 
      'categoria_cuenta' => 'DEVOLUCIONES REBAJAS Y DESCUENTOS' 
     } 
}; 

my %param = { 
     'concepto_ID' => "$concepto_ID", 
     'formato_ID' => $formato_ID, 
     'obj_cuentascontables'=> { %obj_cuentascontables }, 
}; 

後來我轉儲%param和我得到這個:

$VAR1 = { 
      'concepto_ID' => '5501', 
      'formato_ID' => 1001, 
      'obj_cuentascontables' => { 
             'HASH(0xf16eb70)' => undef 
            } 
     }; 

我不能使用「HASH」的事情,所以,我試圖看看我是否錯誤地引用了哈希,並且創建了另一個非常相似的哈希。

my %obj_cuentascontables =(); 
    $obj_cuentascontables{'4210'}{'banderamayor'} = 'true'; 
    $obj_cuentascontables{'4210'}{'enlace'} = 'true'; 
    $obj_cuentascontables{'4210'}{'not_rlike_nombre'} = 'DEVOLUCION'; 
    $obj_cuentascontables{'4410'}{'banderamayor'} = 'true'; 
    $obj_cuentascontables{'4410'}{'enlace'} = 'true'; 
    $obj_cuentascontables{'4410'}{'rlike_nombre'} = 'DEVOLUCION'; 
    $obj_cuentascontables{'4410'}{'categoria_cuenta'} = 'DEVOLUCIONES REBAJAS Y DESCUENTOS'; 

    my %param =(); 
    $param{'concepto_ID'}= $concepto_ID; 
    $param{'formato_ID'} = $formato_ID; 
    $param{'obj_cuentascontables'} = \%obj_cuentascontables; 

然後自卸車返回此:

$VAR1 = { 
      'concepto_ID' => 5501, 
      'formato_ID' => 1001, 
      'obj_cuentascontables' => { 
             '4410' => { 
                'enlace' => 'true', 
                'rlike_nombre' => 'DEVOLUCION', 
                'categoria_cuenta' => 'DEVOLUCIONES REBAJAS Y DESCUENTOS', 
                'banderamayor' => 'true' 
               }, 
             '4210' => { 
                'enlace' => 'true', 
                'not_rlike_nombre' => 'DEVOLUCION', 
                'banderamayor' => 'true' 
               } 
            } 
     }; 

我的問題是,爲什麼!!! ...我想在我的第一個結構中的第二轉儲...這是可能的嗎?

回答

4

始終使用use strict; use warnings;!後者會識別錯誤。

$ perl -e'use strict; use warnings; my %obj_cuentascontables = { };' 
Reference found where even-sized list expected at -e line 1. 

當您希望將一個標量列表用作鍵和值時,您將爲列表分配一個哈希引用。請記住,

{ ... } 

大致

do { my %anon = (...); \%anon } 

所以

my %obj_cuentascontables = { ... }; 

my %obj_cuentascontables = (...); 
5

如果你仔細看看你是如何在第一個代碼段中構造散列的,那麼你使用了花括號{}。在分配的上下文中,這是爲散列分配散列引用。

,你需要的是圓括弧()

my %obj_cuentascontables = (
    '4210' => { 
      'banderamayor' => 'true', 
      'enlace' => 'true', 
      'not_rlike_nombre' => 'DEVOLUCION' 
    }, 
    '4410' => { 
      'banderamayor' => 'true', 
      'enlace' => 'true', 
      'rlike_nombre' => 'DEVOLUCION', 
      'categoria_cuenta' => 'DEVOLUCIONES REBAJAS Y DESCUENTOS' 
    } 
); 

這就是爲什麼你應該use warnings;,因爲它會提醒你一下:

Reference found where even-sized list expected ... 
0

您沒有使用use warnings;這將幫助你看到的應該是奇數錯誤。

我想你想讓你的$param{obj_cuentascontables}指向散列%obj_cuentascontables。這樣,您可以參考:

$param{obj_cuentascontables}->{4210}->{banderamayor} 

的值爲true

你需要一個參考分配給您的%obj_cuentascontables哈希爲obj_cuentascontables關鍵在你%param哈希值。

my %param = { 
     concepto_ID   => "$concepto_ID", 
     formato_ID   => $formato_ID, 
     obj_cuentascontables => \%obj_cuentascontables, 
}; 

我希望在引用參考文獻時使用->語法。據官方統計,這些都是一樣的:

$param{obj_cuentascontables}->{4210}->{banderamayor} 
$param{obj_cuentascontables}{4210}{banderamayor} 

然而,我發現使用->語法提醒我這是不是一個真正的哈希值,但參考的哈希值。當我構建這些複雜的數據結構時,這有助於我獲得正確的語法。

你做了什麼與此類似:

my $hash_address = sprintf "%s", \%obj_cuentascontables; # Stingifying the hash reference 
$param{obj_cuentascontables} = { }; 
$param{obj_cuentascontables} = { $hash_address => };  # Not 100% Perl will parse this... 

您分配一個散列引用$param{obj_cuentascontables}這是你想要的東西,但你使用的散爲重點的地址,也沒有價值。