对不起,对于这篇较长的文章,代码应该很容易理解Perl的退伍军人。我是新来的Perl和我试图找出这段代码:在Perl中引用散列的哈希
my %regression;
print "Reading regression dir: $opt_dir\n";
foreach my $f (glob("$opt_dir/*.regress")) {
my $name = (fileparse($f, '\.regress'))[0];
$regression{$name}{file} = $f;
say "file $regression{$name}{file}";
say "regression name $regression{$name}";
say "regression name ${regression}{$name}";
&read_regress_file($f, $regression{$name});
}
sub read_regress_file {
say "args @_";
my $file = shift;
my $href = shift;
say "href $href";
open FILE, $file or die "Cannot open $file: $!\n";
while (<FILE>) {
next if /^\s*\#/ or /^\s*$/;
chomp;
my @tokens = split "=";
my $key = shift @tokens;
$$href{$key} = join("=", @tokens);
}
close FILE;
}
的say
线是东西我加入调试。
我的困惑是子程序read_regress_file
的最后部分。它看起来像href
是从线my $href = shift;
的参考。但是,我试图弄清楚如何通过散列首先被引用。
%regression
是密钥为$name
的散列。该.regress
文件中的代码读取是简单的文件中包含的表单变量及其值:
var1=value
var2=value
...
所以它看起来像行
my $name = (fileparse($f,'\.regress'))[0];
是创建键作为标量和行
$regression{$name}{file} = $f;
实际上使得$name
成为一个散列。
在我的调试线
say "regression name $regression{$name}";
打印参考,例如
regression name HASH(0x7cd198)
但
say "regression name ${regression}{$name}";
打印的名称,像
regression name {filename}
与大括号内的文件名称。
但是,使用
say "regression name $$regression{$name}";
打印什么。
从我的理解,它看起来像regression
是一个实际的散列,但引用是嵌套的散列,name
。
为什么我的尊敬测试行使用大括号工作,但其他形式的解引用($$
)不起作用?
此外,为什么打印时名称仍然被大括号包围?我不应该取代$name
吗?
如果难以阅读,我很抱歉。我很困惑哪个散列实际上被引用,以及如果引用是嵌套散列,如何去引用它们。
当您对结构有疑问时,[Data :: Dumper'](http://perldoc.perl.org /Data/Dumper.html)是_great_帮助。 尝试'使用Data :: Dumper;'然后(在'read_regress_file'中)'print Data :: Dumper-> Dump([$ href]);'。您必须传递一个引用,即'$ href'或'\%regression'。 – PerlDuck
你的问题非常缺乏重点。你谈了很多关于你的困惑,但从不问一个问题。你想知道什么? – Borodin