1

我有以下子程序。

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

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

它可以称为

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

我怎样才能$ref引用传递给的任何内容Function?我目前的方法不起作用。

4

3 回答 3

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') {
     ...
  }
于 2012-09-25T14:09:30.420 回答
1

您可以使用原型函数。尽管 Perl 5 原型一团糟,但在这种情况下它们可以很好地使用。据我了解他们的原型

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

应该可以解决您的问题,并且参考在$_[0].

最大的缺点是您传递的变量必须$以,@% 字符开头,因此您不能Function直接使用常量参数调用:

 Function(1)

失败,但是

 my $temp = 1;
 Function($temp)

作品。


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

于 2012-09-25T13:12:16.590 回答
0

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

sub gimme_a_ref
{
  my $arg=shift;

  if(ref $arg ne ref "")
  {
    return $arg;
  }
  else
  {
    return \$arg;
  }
}
于 2012-09-25T13:19:00.947 回答