2013-01-21 50 views
2

複雜的哈希我有如下簡單的Perl腳本:處理在Perl

#!/usr/bin/perl 
use strict; 
use Data::Dumper; 
my %x; 

$x{"a"}="b"; 
$x{"b"}={'c'=>3,'d'=>4}; 
$x{"c"}={'e'=>{'f'=>5,'g'=>6},'h'=>{'i'=>7,'j'=>8}}; 

print Dumper(%x); 

這是如下輸出我:

> ./temp.pl 
$VAR1 = 'c'; 
$VAR2 = { 
      'e' => { 
        'g' => 6, 
        'f' => 5 
       }, 
      'h' => { 
        'j' => 8, 
        'i' => 7 
       } 
     }; 
$VAR3 = 'a'; 
$VAR4 = 'b'; 
$VAR5 = 'b'; 
$VAR6 = { 
      'c' => 3, 
      'd' => 4 
     }; 
, 

但我想要的輸出中的東西different.so我試過下面代碼:

#!/usr/bin/perl 

use strict; 
use Data::Dumper; 
my %x; 

$x{"a"}="b"; 
$x{"b"}={'c'=>3,'d'=>4}; 
$x{"c"}={'e'=>{'f'=>5,'g'=>6},'h'=>{'i'=>7,'j'=>8}}; 

foreach (keys %x) 
{ 
     if(ref($x{$_}) eq "HASH") 
     { 
     print Dumper(\%{$x{$_}}).","; 
     } 
     else 
     { 
     print $x{$_}.",\n" 
     } 
} 

但是這下面給我一個輸出:

> ./temp.pl 
$VAR1 = { 
      'e' => { 
        'g' => 6, 
        'f' => 5 
       }, 
      'h' => { 
        'j' => 8, 
        'i' => 7 
       } 
     }; 
,b, 
$VAR1 = { 
      'c' => 3, 
      'd' => 4 
     }; 

,但我需要的是爲below.i DONOT需要VAR1等,也=>在output.I剛需鍵和值有空間,他們

之間

c { 
      'e' { 
        'g' 6, 
        'f' 5 
       }, 
      'h' { 
        'j' 8, 
        'i' 7 
       } 
     }, 
a b, 
b { 
      'c' 3, 
      'd' 4 
     } 
所有Perl的專家門診在那裏,有人可以給我正確的方向來打印輸出,因爲我需要它!

我從perleone的建議中得到了我所需要的。 但我也試過以下staement:

my %y={"one"=>404,"two"=>\%x}; 

現在如果我做

print Dumper(\%y); 

它給我的輸出:

> ./temp.pl 
{ 
      'HASH(0x807f08c)' undef 
     } 

在哪裏,我去錯在這裏?

+0

您將不得不編寫一個子能夠以您的首選格式遞歸地轉儲散列鍵/值。使用'keys'可以非常簡單地獲得散列和'ref'的所有關鍵字,以找出某個值何時也是散列(然後您將不得不遞歸)或標量。閱讀'perlfunc(1)'瞭解細節。 – salva

+1

你知道你的第一個例子是錯誤的。你應該傳遞給Dumper的參考:'print Dumper(\%x)'。您應該查看Data :: Dumper的文檔並查看它提供的選項。 – TLP

+0

OK ..i got it.Thanks TLP.Please see see my edit – user1939168

回答

6

看看documentation。使用這些設置:

$Data::Dumper::Pair  = ' '; 
$Data::Dumper::Sortkeys = 1; 
$Data::Dumper::Terse = 1; 

... 

print Dumper(\%x); 
+0

非常感謝Perleone ...讓我知道更好的東西。 – user1939168

+0

請參閱我的edit.i有一個mor ed edt。 – user1939168