我在根据文本输入确定如何在perl中创建嵌套哈希时遇到了一些麻烦。
我需要这样的东西
my % hash = {
key1 => \%inner-hash,
key2 => \%inner-hash2
}
然而我的问题是我不知道apriori会有多少内部哈希。为此,我编写了以下片段来测试是否可以在循环中创建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 :(得分: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
}
}
}
}
}
};
答案 1 :(得分: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的第一步。
答案 2 :(得分:2)
my $hashref = { hash1 => { key => val,... },
hash2 => { key => val,..} };
您也可以将m//x
修饰符与正则表达式一起使用,它几乎不可读。