• ベストアンサー

引数を受け取る@_について

subプロシージャ(関数)の引数について教えていただきたいのですが,例えば, @data1=(1,2,3,4,5); @data2=(6,7,8,9,10); &stat::cov(@data1,@data2); などとすると,sub cov{}で@_という配列の中に一緒に格納されますよね。しかし私としては@data1に格納されているデータと@data2に格納されているデータを別の配列に渡したい(別の配列で受け取るようにしたい)のです。 考えた策としては sub cov{ my $n=@_; my $h=$n/2; for($i=0;$i<$h;$i++){ $x[$i]=shift(@_); } for($k=0;$k<$h;$k++){ $y[$k]=shift(@_); } (以下省略) のように,shift関数で1つずつずらして違う配列に格納していくという方法なのですが,これは@data1と@data2に格納されているデータ数が等しい場合で無いと使いものになりません。 指定した引数を@_以外の配列で受け取らせる方法などはないものでしょうか?ちなみにPerlはまだ初心者にも達していないド素人ですのであまりプロ志向のものは勘弁してください(それでもなければ仕方ありませんが、、、)。

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

  • ベストアンサー
  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.2

それじゃアマ指向(ダサイ方法ってこと?)で… @data1=(1,2,3,4,5); @data2=(6,7,8,9,10); $data=join '<1>',@data1,"<2>",@data2; &stat::cov($data); と、くっつけて渡した後、受け側で ($buf1,$buf2)=split(/<2>/,$_[0]); @data3=split(/<1>/,$buf1); @data4=split(/<1>/,$buf2); と分離 …No1の回答を参考にしてください^^;

backs
質問者

お礼

回答ありがとうございました。 galludaさんが教えてくださった方法(参照)を使わずともこういう書き方もできるのですね。

その他の回答 (2)

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

・stat::cov に, 「@data1 の要素数」も渡す: stat::cov の中で splice する. ・stat::cov を宣言するときに sub cov(\@\@) とプロトタイプを付ける: 結果的に #1 と同じようにリファレンスが渡される. & を付けて呼出してはいけない. くらい?

backs
質問者

お礼

回答ありがとうございました。 宣言のときに&は付けて宣言してはいけなかったのですか。。。でもPerlの本を読んでみると確かに&を付けていないことを知りました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。…恐らく、質問者さんのおっしゃるところの「プロ志向」な回答になりますので、最終手段としてでもご覧いただければ。 直接的には「参照を用いる」のが正解になります。 @data1=(1,2,3,4,5); @data2=(6,7,8,9,10); stat::cov(\@data1,\@data2); このような形でcallしていただければ、受け取りのほうで、配列への参照が受け取れますので。 メモリ効率を無視するのであれば、この後、受け取り手のほうで sub cov{ @data1 = @{$_[0]}; @data2 = @{$_[1]}; という風に記述していただければ、配列を「配列のまま」渡すことが可能になります。 以上、何かの参考にでもなれば幸いです。

backs
質問者

お礼

回答ありがとうございました。 この数日間で参照を学んだのでgalludaさんのいっていることがどういうことか分かりました。Perlの参照はCのポインタのようなもののようですね。

関連するQ&A