如何返回数组和hashref?

时间:2013-07-06 20:37:15

标签: perl hash reference subroutine dereference

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

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

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

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接收哈希,但其返回的哈希引用为空或我不知道。最后没有打印出来。

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

Can't use an undefined value as a HASH reference
    at C:/Users/workspace/Perl_projekt/Extractor.pm line 82.

我的错误在哪里?

我很感谢任何建议。

2 个答案:

答案 0 :(得分:5)

数组在perl中变平,因此你的hashref会变成@var

尝试这样的事情:

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

sub analyze {
  ...
  return (\@array, \@hash);
}

答案 1 :(得分: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需要一个单独的问题: - )