- ベストアンサー
引数を受け取る@_について
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はまだ初心者にも達していないド素人ですのであまりプロ志向のものは勘弁してください(それでもなければ仕方ありませんが、、、)。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
それじゃアマ指向(ダサイ方法ってこと?)で… @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の回答を参考にしてください^^;
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
・stat::cov に, 「@data1 の要素数」も渡す: stat::cov の中で splice する. ・stat::cov を宣言するときに sub cov(\@\@) とプロトタイプを付ける: 結果的に #1 と同じようにリファレンスが渡される. & を付けて呼出してはいけない. くらい?
お礼
回答ありがとうございました。 宣言のときに&は付けて宣言してはいけなかったのですか。。。でもPerlの本を読んでみると確かに&を付けていないことを知りました。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。…恐らく、質問者さんのおっしゃるところの「プロ志向」な回答になりますので、最終手段としてでもご覧いただければ。 直接的には「参照を用いる」のが正解になります。 @data1=(1,2,3,4,5); @data2=(6,7,8,9,10); stat::cov(\@data1,\@data2); このような形でcallしていただければ、受け取りのほうで、配列への参照が受け取れますので。 メモリ効率を無視するのであれば、この後、受け取り手のほうで sub cov{ @data1 = @{$_[0]}; @data2 = @{$_[1]}; という風に記述していただければ、配列を「配列のまま」渡すことが可能になります。 以上、何かの参考にでもなれば幸いです。
お礼
回答ありがとうございました。 この数日間で参照を学んだのでgalludaさんのいっていることがどういうことか分かりました。Perlの参照はCのポインタのようなもののようですね。
お礼
回答ありがとうございました。 galludaさんが教えてくださった方法(参照)を使わずともこういう書き方もできるのですね。