• ベストアンサー

引数に配列かスカラーかどちらか入力された時の関数内の処理

以下のように、引数に配列かスカラーかどちらか入力される場合に 関数内で異なる処理をさせたいのですが、どうすればよいのでしょうか? sub test{ my $arv = shift; # arvが配列ならば、その要素を表示  # arvがスカラーなら、そのまま表示 }

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

厳密にいうと「リファレンスを渡さない限り無理」じゃないかなぁ? 「長さ1 の配列」と「スカラー」を区別できないような気がする.

その他の回答 (3)

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.4

こんにちは、#3です、連続ですみません。 http://oshiete1.goo.ne.jp/qa3141930.html こういう質問もしてらっしゃったのですね、 既に理解してらっしゃる様なので、#3は無視してください。 ごめんなさい。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.3

こんにちは、 以前こんな質問 http://oshiete1.goo.ne.jp/qa3138213.html をしてらっしゃいました。 回答ではありませんし、はずしてるかも知れませんが… うまく説明できないのですが、 ”引数に配列を渡す”ってのは、 &foo(@bar); こういう事を指しているのでしょうか? これは、”配列オブジェクト”の様な物を渡しているのではありません。 配列に含まれるスカラーをリストで渡しています。 ですから、 @bar = qw(a b); @barbar = qw(c d); &foo(@bar,@barbar); の場合、 &foo は()内のリストを展開して一つのリストとして受け取ります。 別々の配列として受け取る事はできません。 ただ、各スカラー値はそれぞれ実体の別名なので、&foo 内で変更すると @bar @barbar が書き換えられてしまいます。 で、二つの配列を一つのリストとしてではなく、 二つの配列のリファレンスとして受け取りたい場合一般的には、 &foo(\@bar,\@barbar); とします。(\はバックスラッシュ) これは、二つのリファレンスを一つのリストとして受け取るので、 それぞれを正しくデリファレンスすれば、 &foo 内で @bar と @barbar を 別々の配列として処理できます。 スカラーとかリストが何者でリファレンスやデリファレンスが云々は それなりの書籍に目を通された方が理解が早いと思います。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

残念ながらそのやり方では判定できません。 なぜなら、Perlの場合わたされた引数は @_ という配列に展開されてしまうからです。 #細かいこというと色々あるんですがとりあえず略 で、 my $arv = shift; と書いたとき実際には何が起きているかというと、 先に説明に出た @_ という配列の先頭の一要素を とってきているだけなのです。 ですから、 @_ の長さが1かそれを超えるかで見ればいいんじゃないでしょうか? 配列のリファレンスがわたってきたときは また別の話です。 sub f1 { print scalar(@_), "\n"; } f1(1); f1(1,2); @foo = (1,2,3,4,5); f1(@foo); 実行結果: 1 2 5

関連するQ&A