我有以下子程序。
sub Function{
my $ref = \($_[0]);
if(ref($ref) eq 'SCALAR'){
. . .
}
}
我试图让它工作,以便将列表,标量或散列传递给它,它将其转换为引用,并取决于该引用是ARRAY
类型,SCALAR
还是HASH
,执行不同的操作。
可以称为
Function(%a)
Function($a)
Function(@a)
如何让$ref
成为传递给Function
的内容的引用?我目前的方法不起作用。
答案 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;
}
}