2013-03-24 194 views
3

我在計算如何在基於文本輸入的perl中創建嵌套哈希時遇到了一些麻煩。哈希的Perl嵌套哈希

我需要像這樣

my % hash = { 
key1 => \%inner-hash, 
key2 => \%inner-hash2 
} 

但我的問題是我不知道先驗多少內部散列會有。爲此,我寫了下面這段代碼來測試一個str變量是否可以在一個循環中創建,並且它的引用存儲在一個數組中,並在稍後解除引用。

{ 
    if($line =~ m/^Limit\s+$mc_lim\s+$date_time_lim\s+$float_val\s+$mc\s+$middle_junk\s+$limit \s+$value/) { 
     my $str = $1 . ' ' . $2 . ' ' . $7; 
     push (@test_array_reference, \$str); 
    } 
} 
foreach (@test_array_reference) { 
    say $$_; 
} 

Perl因爲不是標量運行時錯誤而死亡。我在這裏有點失落。任何幫助將不勝感激。

+0

沒有什麼會跳出來,因爲那代碼顯然是錯誤的(儘管我不認爲創建標量引用會對您的原始問題有所幫助)。你能否包含來自Perl的完整的逐字錯誤信息? – rra 2013-03-24 17:48:39

+0

要將值存儲在任意深度的哈希中,請參閱Data :: Diver。你的第一個哈希賦值是壞的;要分配的列表應該在'()'而不是'{}'中。你能否展示一個完整的例子,它不會產生標量錯誤? – ysth 2013-03-24 17:51:59

+0

在./BadMailClassLimit.pl第43行,第9817388行不是SCALAR引用。 – subramanian 2013-03-24 18:00:59

回答

5

要回答您的第一個(主要?)問題,您不需要知道創建多少個哈希,如果您閱讀文本並隨時創建它們。本示例使用由空格分隔的字符串作爲鍵,但您可以使用任何輸入文本作爲您的用途。

my $text = 'these are just a bunch of words'; 
my %hash; 

my $hashRef = \%hash;   # create reference to initial hash 
foreach (split('\s', $text)){ 
    $hashRef->{$_} = {};  # create anonymous hash for current word 
    $hashRef = $hashRef->{$_}; # walk through hash of hashes 
} 

您也可以參考任意內部哈希並且設置了值,

$hash{these}{are}{just}{a}{bunch}{of}{words} = 88; 
$hash{these}{are}{just}{a}{bunch}{of}{things} = 42; 
$hash{these}{things} = 33; 

爲直觀起見,Data:Dumper可能會有幫助,

print Dumper %hash; 

產生,

$VAR1 = 'these'; 
$VAR2 = { 
      'things' => 33, 
      'are' => { 
        'just' => { 
           'a' => { 
              'bunch' => { 
                 'of' => { 
                   'things' => 42, 
                   'words' => 88 
                   } 
                } 
             } 
           } 
        } 
     }; 
1
my $hashref = { hash1 => { key => val,... }, 
       hash2 => { key => val,..} }; 

也可能要使用m//x修改與您正則表達式,它幾乎沒有可讀性,因爲它是。

+0

那麼問題是如何動態創建內部哈希並使用它。 – subramanian 2013-03-24 18:05:33

+0

通過在推中使用{},那麼您將得到一個哈希引用列表 – snoofkin 2013-03-24 19:02:03

3

創建哈希散列是非常簡單的:

my %outer_hash = {}; 

不完全是必要的,但是這基本上意味着你的哈希的每一個元素是另一個散列的引用。

試想根據員工數量鍵控僱員哈希:

$employee{$emp_num}{first} = "Bob"; 
$employee{$emp_num}{last} = "Smith"; 
$employee{$emp_num}{phones}{cell} = "212-555-1234"; 
$employee{$emp_num}{phones}{desk} = "3433"; 

這個符號的問題是,它變得相當困難了一段時間後閱讀。輸入箭頭符號:

$employee{$emp_num}->{first} = "Bob"; 
$employee{$emp_num}->{last} = "Smith"; 
$employee{$emp_num}->{phones}->{cell} = "212-555-1234"; 
$employee{$emp_num}->{phones}->{desk} = "3433"; 

最大的問題具有複雜結構,如這是你失去了use strict找到錯誤的能力:

​​

哎呦!我用Phones而不是phones。當你開始使用這種複雜的結構時,你應該使用面向對象的語法。幸運的是,perlobj教程很容易理解。順便說一句,複雜的數據結構處理和使用面向對象的Perl的能力會讓你進入大聯盟。這是編寫更強大和更復雜的Perl的第一步。

+0

當爲哈希鍵指定一個值時,您不會調用'my'。如果你用'use strict'和'use warnings'運行這段代碼,你會在''my'變量%employee掩碼的早期聲明中得到很多錯誤......' – RickF 2013-03-25 15:31:52

+0

對不起。我的錯。我已經修復了代碼。 – 2013-03-25 17:31:36