将数组,标量和散列传递给Perl中的子例程

时间:2013-08-11 13:56:10

标签: arrays perl hashmap

将多个数组,变量,哈希发送到子程序的最佳方法是什么?

简单的形式,有效。

my $msg = &getMsg(1,2,3);
print $msg;

sub getMsg {
    my($a, $b, $c) = @_;
}

我在使用此版本时遇到困难,并且不确定如何在不使用不是我想要的全局的情况下将数据安全地发送到子例程。

my @array = ('a','b','c');
my $str = "Hello";
my %hash = (
    'a' => ['100','nuts'],
    'b' => ['200','bolts'],
    'c' => ['300','screws'],
);

my $msg = getMsg(@array, $str, %hash);
print $msg;

sub getMsg {
    my (@a, $s, %h) = @_;
    my $MSG;
    foreach my $x (@a) {
        $MSG .= "\n$str, $x your hash value = $h{$x}[0] $h{$x}[1]";
    }
    return $MSG
}

2 个答案:

答案 0 :(得分:22)

您可以使用参考:

getMsg(\@array, \%hash, $scalar);

sub getMsg {
    my ($aref, $href, $foo) = @_;
    for my $elem (@$aref) {
        ...
    }
}

请注意您尝试的作业:

my (@a, $s, %h) = @_;

不起作用,因为@a - 作为一个数组 - 将会覆盖整个列表,使$s%h保持未初始化状态。

答案 1 :(得分:5)

我更喜欢TLP的答案,但您也可以使用原型:

getMsg(@array, %hash, $scalar);

sub getMsg (\@\%$) {
    my ($aref, $href, $foo) = @_;
    for my $elem (@$aref) {
        ...
    }
}

原型(\@\%$)在参数被展平并加载到@_之前,强制调用列表引用,散列引用和标量的子程序调用的参数。在子例程中,您将收到列表引用和哈希引用,而不是数组和哈希。

通常,don't use prototypes