4

我在弄清楚如何根据文本输入在 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 死于非标量运行时错误。我在这里有点迷路了。任何帮助将不胜感激。

4

3 回答 3

7

要回答您的第一个(主要?)问题,如果您浏览文本并随时创建它们,您不需要知道要创建多少哈希。此示例使用由空格分隔的字符串中的单词作为键,但您可以使用任何输入文本来满足您的目的。

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
                                                               }
                                                     }
                                        }
                               }
                   }
        };
于 2013-03-24T19:26:11.777 回答
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发现错误的能力:

$employee{$emp_num}->{Phones}->{cell} = "212-555-1234";

哎呀!我用Phones而不是phones. 当您开始使用这种类型的复杂结构时,您应该使用面向对象的语法。幸运的是,perlobj教程很容易理解。

顺便说一句,复杂的数据结构处理和使用面向对象的 Perl 的能力让你进入了大联盟。这是编写更强大和更复杂的 Perl 的第一步。

于 2013-03-24T22:07:40.513 回答
3
my $hashref = { hash1 => { key => val,... },
                hash2 =>  { key => val,..}  };

你也可能想在m//x你的正则表达式中使用修饰符,它几乎不可读。

于 2013-03-24T17:56:48.317 回答