2012-11-09 46 views
0

我有以下的Perl代码:填充和散列的访问数组

@searchInfo =(); 

sub main() 
{ 
    processCmdLine(); 

    foreach my $info (@searchInfo) 
    { 
     print "Search field: " . $info{field} . "\n"; 
     print "Search value: " . $info{value} . "\n"; 
    } 
} 

sub processCmdLine() 
{ 
    while(@ARGV > 1) 
    { 
     $rec = {}; 
     $rec{field} = shift(@ARGV); 
     $rec{value} = shift(@ARGV); 
     print "$info{field} = $info{value}\n"; 
     push @searchInfo, $rec; 
    } 
} 

当我运行此,用以下命令:script.pl f1 v1 f2 v2,我得到下面的输出

f1 = v1 
f2 = v2 
Search field: 
Search value: 
Search field: 
Search value: 

我根据代码this tutorial

数组中的哈希为什么有空值的原因是什么?

+2

总是放在开头:'严格使用;使用警告;'。这会解释你很多错误。 –

回答

1

始终使用use strict; use warnings; !!!它会告诉你你正在访问名为%info%rec的哈希,但是你没有这样的变量。

哈希值是标量。因此,它们不能包含散列。这可以通过使用散列引用来近似。您似乎通过使用$rec = {};来实现此目的,但是您再也不会使用该变量。

修复:

my $rec = {}; 
$rec->{field} = shift(@ARGV); 
$rec->{value} = shift(@ARGV); 
push @searchInfo, $rec; 

清洁修复:

my %rec; 
$rec{field} = shift(@ARGV); 
$rec{value} = shift(@ARGV); 
push @searchInfo, \%rec; 

不要忘了固定取出器太:

print "Search field: $info->{field}\n"; 
print "Search value: $info->{value}\n"; 

但是为什么你创造一大堆有一个关键的哈希?!你也许说到做到:

%search_info = @ARGV; 

然后取出器将

for my $key (keys(%search_info)) { 
    my $val = $search_info{$key}; 
    print "Search field: $key\n"; 
    print "Search value: $val\n"; 
} 
+0

认为我需要阅读一些perl教程。我认为'$ rec {field}'和'$ rec - > {field}'是一回事。谢谢! – tvStatic

+1

'$ rec {$ key}'表示存储在散列'%rec'的键'$ key'处的值。 '$ rec - > {$ key}'表示存储在由'$ rec'引用的哈希键'$ key'处的值。 – ikegami

0

你的子程序中,则不应使用@ARGV。改为使用@_,并使用@ARGV作为参数调用子例程。这样,如果您稍后想要将不同的数组传递给子例程,则只需更改原始调用,而不是查找对硬编码定义的所有位置。这将为您和其他与您的代码联系的人节省时间调试。这也可以让你在子例程中抛出一个不同值的数组进行测试,而不必通过在命令行键入args来进行测试。

sub processCmdLine() { 
     while(@ARGV > 1) {  
      $rec = {}; 
      $rec{field} = shift(@ARGV); 
      $rec{value} = shift(@ARGV);j 
      print "$info{field} = $info{value}\n"; 
      push @searchInfo, $rec; 
     } 
    } 

变为:

sub processCmdLine() { 
     while(@_ > 1) { 
      my %rec; 
      ($rec{field}, $rec{value}) = @_; 
      print "$info{field} = $info{value}\n"; 
      push @searchInfo, $rec; 
     } 
    } 
    processCmdLine(@ARGV); 

注:此examply只描绘我的建议@ARGV的变化,并通过创建一个哈希,而不是一个参考修复无用参考。它没有解决设计问题ikegami提到关于创建多个单一密钥哈希。