1

我想制作一个将元素(带值的键)添加到先前定义的哈希的子例程。该子例程在循环中被调用,因此散列增长。我不希望返回的哈希覆盖现有元素。

最后,我想输出整个累积的哈希值。

现在它不打印任何东西。最终的哈希看起来是空的,但那不应该是。我已经尝试过使用哈希引用,但它并没有真正起作用。简而言之,我的代码如下所示:

sub main{
  my %hash;
  %hash=("hello"=>1); # entry for testing

  my $counter=0;
  while($counter>5){ 
    my(@var, $hash)=analyse($one, $two, \%hash);
    print ref($hash);

    # try to dereference the returning hash reference,
    # but the error msg says: its not an reference ...
    # in my file this is line 82
    %hash=%{$hash};

    $counter++;
  }

  # here trying to print the final hash
  print "hash:", map { "$_ => $hash{$_}\n" } keys %hash;
}

sub analyse{
  my $one=shift;
  my $two=shift;
  my %hash=%{shift @_};
  my @array; # gets filled some where here and will be returned later 

  # adding elements to %hash here as in 
  $hash{"j"} = 2;  #used for testing if it works

  # test here whether the key already exists or
  # otherwise add it to the hash

  return (@array, \%hash);
}

但这根本不起作用:子例程analyse接收哈希,但它返回的哈希引用是空的或者我不知道。最后什么都没有打印出来。

首先它说,它不是参考,现在它说:

不能使用未定义的值作为 HASH 引用
    在 C:/Users/workspace/Perl_projekt/Extractor.pm 第 82 行。

我的错误在哪里?

我很感谢任何建议。

4

2 回答 2

5

数组在 perl 中被展平,所以你的 hashref 会被@var.

尝试这样的事情:

my ($array_ref, $hash_ref) = analyze(...)

sub analyze {
  ...
  return (\@array, \@hash);
}
于 2013-07-06T20:44:23.610 回答
0

如果您通过引用传递哈希(如您所做的那样),则无需将其作为子例程返回值返回。您在子例程中对哈希的操作将坚持下去。

 my %h = ( test0 => 0 );

 foreach my $i ( 1..5 ) {
    do_something($i, \%h);
 }

 print "$k = $v\n" while ( my ($k,$v) = each %h );


 sub do_something {
   my $num = shift;
   my $hash = shift;

   $hash->{"test${num}"} = $num;  # note the use of the -> deference operator
 }

您在子例程中使用 @array 将需要一个单独的问题:-)

于 2013-07-06T20:56:43.937 回答