2014-09-22 72 views
1

我有一個散列哈希,我發送到子程序,我想訪問它的鍵和它的值(鍵和值)。通過引用訪問「散列哈希」的內部值

我:

sub replace_sub { 
    my ($result_dir, $FilesHash) = @_; 
    foreach my $file (keys %{$FilesHash}) { 
     open(INPUT_FILE, "$result_dir/$file") or die "Can't create output file\n"; 
     my @LINES = <INPUT_FILE>; 
     open(my $output_file, ">", "$result_dir/$file") or die "Can't create output file\n"; 
     foreach my $myline (keys %{ $FilesHash{$file} }) { 
      for (my $i = 0; $i <= $#LINES; $i += 1) { 
       if ($LINES[$i] =~ m/$myline/) { 
        my $line = $LINES[$i]; 
        $LINES[$i] =~ s/\Q$line\E/\/\/ $line $FilesHash{$file}{$myline}\n/g; 
       } 
      } 
     } 
     print $output_file @LINES; 
     close(INPUT_FILE); 
     close($output_file); 
    } 
} 

,但我不能弄清楚如何訪問內哈希值, 正試圖做到這一點的代碼行是:

my $myline (keys %{ $FilesHash{$file} }) 

$LINES[$i] =~ s/\Q$line\E/\/\/ $line $FilesHash{$file}{$myline}\n/g; 

我該如何訪問它們?

我打算調用subroutin這樣:

replace_sub ($result_dir, \%Hash) 

回答

3

use strict;會告訴你,有作爲%FilesHash作爲$FilesHash沒有這樣的事情是hashref,從而

$FilesHash{$file} 

應及時更換與

$FilesHash->{$file} 
+0

如果我理解正確,在你的例子中$ v2將保存內部值? 例如:'my%Hash =(「external_key」=> {「inner_key」=>「inner_value」,},); '比$ v2 =「inner_value」? – user3350919 2014-09-22 08:14:32

+0

@ user3350919是的,在你的情況下是'$ FilesHash - > {$ file} {$ myline}' – 2014-09-22 08:18:04

0

您可以使用01當迭代散列時::

while (($key1, $value1) = each %{$FilesHash}) { 
    while (($key2, $value2) = each %{$value1}) { 
     print "[$key1] $key2 => $value2\n"; 
    } 
} 

N.b.你可能會發現這更具可讀性,但不是每個人都認爲這是'好'的做法(閱讀評論@tobyink)

+4

很多非常聰明的程序員現在都在推薦[避免'each'](http://blogs.perl。 org/users/rurban/2014/04/do-not-use-each.html),因爲它可能導致相當混亂的行動距離問題。 '每個'都很快,但循環'鍵'可以更安全。就個人而言,我會循環'keys',並且只考慮每個特定的隔離循環,這些特定的隔離循環在基準測試時已被證明是瓶頸,即使如此,只有當它被證明是安全的。 – tobyink 2014-09-22 10:52:35