2014-09-22 49 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