對不起,對於這篇較長的文章,代碼應該很容易理解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