Perl函数:接受散列,数组或标量作为参数

时间:2012-09-25 13:05:48

标签: perl reference parameter-passing

我有以下子程序。

 sub Function{
   my $ref = \($_[0]);
   if(ref($ref) eq 'SCALAR'){
   . . .
   }
}

我试图让它工作,以便将列表,标量或散列传递给它,它将其转换为引用,并取决于该引用是ARRAY类型,SCALAR还是HASH,执行不同的操作。

可以称为

Function(%a)
Function($a)
Function(@a)

如何让$ref成为传递给Function的内容的引用?我目前的方法不起作用。

3 个答案:

答案 0 :(得分:4)

Function(%a)
Function($a)
Function(@a)

你无法做你想要的。在Function内部无法确定是否传递了数组或散列,因为实际上,您无法在第一个位置将数组或散列传递给子节点。你只能传递一个清单;哈希和数组将转换为上面子调用中的列表。

您应该首先传递对该函数的引用:

Function(\%a)
Function($a)
Function(\@a)

然后你可以检查它是什么:

sub Function {
  my $param = shift;
  if (not ref $param) {
     ...
  } elsif (ref $param eq 'HASH') {
     ...
  } elsif (ref $param eq 'ARRAY') {
     ...
  }

答案 1 :(得分:1)

您可以使用原型功能。虽然Perl 5原型完全混乱,但在这种情况下它们可以很好地使用。据我了解原型

sub Function (\[$@%]) {...}

应解决您的问题,并且引用位于$_[0]

最大的缺点是您传递的变量$@% 字符开头,因此您无法直接使用常量参数调用Function

 Function(1)

失败了,但是

 my $temp = 1;
 Function($temp)

作品。


您的方法失败,因为@_ 是一个列表,而且所有元素都是标量。

答案 2 :(得分:0)

为什么不检查传入的参数是否为参考并采取相应的行动?

sub gimme_a_ref
{
  my $arg=shift;

  if(ref $arg ne ref "")
  {
    return $arg;
  }
  else
  {
    return \$arg;
  }
}