1

次のサブルーチンがあります。

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

リスト、スカラー、またはハッシュを渡すように機能させようとしています。これは参照に変換され、その参照がタイプARRAYであるSCALARか、または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 に答える