0

基本上,当我将哈希转移到子程序中使用它时,我得到了错误:哈希分配中的元素数量为奇数。如果我希望将散列传递给子例程,我应该使用散列引用吗?

#!/usr/bin/perl -w
use strict;

my ($a, $b, $c, %hash) = &getVals() ;
&run($a,$b,$c,%hash) ;


sub getVals() {
    $hash{"f"} = "abc" ;
    $a = "A" ;
    $b = "B" ;
    $c = "C" ;
    return ($a, $b, $c, %hash) ;
}


sub run() {
    my $a = shift;
    my $b = shift;
    my $c = shift;
    my %hash = shift; #error here 


    #do stuff here. . . 
}  
4

3 回答 3

6

shift从中删除第一个元素@_并将其返回。您可以使用引用,也可以将整个列表(在移动单个元素之后)分配给哈希:

my %hash = @_;
于 2013-05-27T21:21:51.910 回答
3

将哈希传递给子程序是不可能的。子例程可以将标量列表作为参数。(这也是他们唯一可以返回的东西。)

getVals返回 5 个标量:

  1. A
  2. B
  3. C
  4. f
  5. abc

shift@_删除后返回第一个标量。您希望将@_(fabc) 中的所有剩余标量分配给哈希,而不仅仅是第一个。

sub run {
    my $a = shift;
    my $b = shift;
    my $c = shift;
    my %hash = @_;
    ...
}

或者

sub run {
    my ($a, $b, $c, %hash) = @_;
    ...
}
于 2013-05-27T22:03:14.187 回答
0

尝试这个

#!/usr/bin/perl -w

use strict;

my ($a, $b, $c, %hash) = &getVals() ;
&run($a,$b,$c,%hash) ;

sub getVals() {
    $hash{"f"} = "abc" ;
    $a = "A" ;
    $b = "B" ;
    $c = "C" ;
    return ($a, $b, $c, %hash) ;
}

sub run() {
    my $a = shift;
    my $b = shift;
    my $c = shift;
    my %hash = @_; 

    #.............
} 
于 2013-05-28T04:48:59.957 回答