2012-11-30 118 views
1

我是perl的新手新手。我正在尝试创建一个返回哈希值的函数。以下代码段简单地返回散列的最后一个索引。我搜索了一下,无法找到我需要的东西。欣赏是否有人能告诉我我哪里出错了。Perl哈希返回值

我期待,如果我通过“he_1”,我应该得到回报回值1,等等。但我看到的是9

#!/usr/bin/perl 

my %IndexMap =(); 

my $MAX_V = 5; 
my $MAX_T = 10; 

sub InitIndexMap { 
    foreach my $i (0..$MAX_V-1) { 
     $IndexMap["he_".$i] = $i; 
     print "he_".$i; 
     print $IndexMap["he_".$i]; 
    } 

    foreach my $i ($MAX_V..$MAX_T-1) { 
     $IndexMap["un".$i] = $i; 
     print "un".$i; 
     print $IndexMap["un".$i]; 
    } 
} 

sub GetVal { 
    my ($name) = @_; 
    return $IndexMap[$name]; 
} 

&InitIndexMap(); 
my ($index) = &Getval("he_4"); 
print $index; 
+0

[为什么使用strict和warnings?](http://stackoverflow.com/q/8023959/725418) – TLP

回答

7

要读取的散列,使用大括号,而不是括号。试试这个:

sub InitIndexMap { 
    foreach my $i (0..$MAX_V-1) { 
     $IndexMap{ "he_" . $i } = $i; 
     print "he_".$i; 
     print $IndexMap{ "he_" . $i }; 
    } 

    foreach my $i ($MAX_V..$MAX_T-1) { 
     $IndexMap{ "un" . $i } = $i; 
     print "un".$i; 
     print $IndexMap{ "un" . $i }; 
    } 
} 

sub GetVal { 
    my ($name) = @_; 
    return $IndexMap{ $name }; 
} 

您应该将其添加到脚本顶部:

use strict; 
use warnings; 

的一般规则总是把这些编译指示。他们的警告和错误可能导致你回答你的问题。

+2

在所有情况下都应该在脚本的顶部打开严格警告和警告,而不仅仅是针对学习perl的人。 – qqx

+1

这更好地解释了我的意思,我可以:http://perl.plover.com/yak/12views/samples/notes.html#sl-31。我还应该补充说,如果你知道自己在做什么,有时你必须关掉严格的编译指令来做一些非常聪明的事情。如果你了解后果,那没有什么不妥。 – gpojd

+2

把它们关掉意味着你有他们的开始,因为你应该。修正了帖子。 – ikegami

3

您应该使用大括号{和}来访问散列。

$hash_name{$key} = $value;

在你的例子中。

$IndexMap{"he_".$i} = $i;

你应该考虑做一些教程。 这是Perl中非常基础的知识。