2013-03-24 195 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