Perlでサブルーチンの引数を複数配列+参照わたし

[上に] [前に] [次に]
J.Naka [E-Mail] 1999/12/11(土) 00:02:30
Perl5です。サブルーチンの引数を、参照渡しで複数の配列を渡したいのです。自己流の超ヘンテコな渡し方を1つだけ使えるのですが、もう少しマトモに理解したく質問です。

ズバリの回答として、
1.応用の利く、呼び側と呼ばれ側の定型的書式を知りたい。

あれば非常に嬉しい解説として、
1.参照と値渡しの意味は知っている。
2.ラクダ本などの解説は要点が散在的に書かれているように見え、把握しきれない。
3.Perl流の概念とそれを表す独特の用語に今イチついていけない。

などを回避する噛み砕いた解説で、参照という物理的単純な仕組みとPerlロジックとその用語の対応関係を、知能指数100前後の頭で理解できたら嬉しいです。
-------------------------
#こんな言語の根本的質問するのは、とても恥ずかしいです(^^;;

J.Naka 1999/12/11(土) 00:56:52
取りあえず、動かない例を(^^;

---------------------------
sub T0($Ar0,@Ar1); # プロトタイプ宣言

T0($Ar0,@Ar1); 呼び出し

sub T0($t0Ar0_,@t0Ar1_) #サブルーチン T0() 定義
{
my (t0Ar0) = $$t0Ar0_;
my (\t0Ar1) = $@t0Ar1_;
}

B-Cus 1999/12/11(土) 05:31:45
@a=(1,2,3);
@b=(4,5,6);
print "\@a=@a \@b=@b\n";
func1(\@a,\@b);
print "\@a=@a \@b=@b\n";
func2(*a,*b);
print "\@a=@a \@b=@b\n";

# リファレンス
sub func1 {
  ($ref_a,$ref_b)=@_;
  foreach ( @$ref_a ){ $_++ }
  foreach ( 0..$#{$ref_b} ){ $$ref_b[$_]++ }
}

# 型グロブ
sub func2 {
  (*glob_a,*glob_b)=@_;
  foreach ( @glob_a ){ $_++ }
  foreach ( 0..$#glob_b ){ $glob_b[$_]++ }
}

cf. 青ラクダ本 「2.7.2 リファレンスを渡す」

J.Naka 1999/12/11(土) 06:24:30
[[解決]]
ども! B-Cusさん。
回答して頂いたコードがマニュアル(ラクダ本)の何処に該当するのかじっくりIQ100以下の頭を動かしてみます。。。ギーコギーコ。

#出来れば、プロトタイプ宣言も付けて貰ったらカッコ良いソースかなぁと思ったりしてて(^^;

B-Cus 1999/12/11(土) 19:38:40
プロトタイプを書かなかったのは
> my (t0Ar0) = $$t0Ar0_;
> my (\t0Ar1) = $@t0Ar1_;
こーゆー書き方を見るに、引数取得の仕方や、変数のことや、
リファレンスのことをわかっておられないようだから、省略
したんだけど。

知識を得ようとするのはいいことだけど、自分のレベルを考えて、
一歩一歩ステップアップしていく方が効率的なのでは?

あと、プロトタイプを付けるときと付けないときで、挙動が変わってしまいます。
なので、「カッコ良い」などという問題ではありません。

sub func3(\@\@);
func3(@a,@b);

sub func3(\@\@) {
  ($ref_a,$ref_b)=@_;
  foreach ( @$ref_a ){ $_++ }
  foreach ( 0..$#{$ref_b} ){ $$ref_b[$_]++ }
}

J.Naka 1999/12/12(日) 02:40:54
>プロトタイプを書かなかったのは
・・・中途略・・・
>なので、「カッコ良い」などという問題ではありません。

はっ仰せの通りです。一句一句その通りです。
「カッコ良い」はユーモア的表現のつもりだったのでずか、師事する局面で不適当な感覚と表現でした。反対の立場ならば自分もそう感じます。。。あっ僕が、B-Cusさんに教えるという意味ではありません(^^;;;

プロトタイプのコード有り難う御座います。
前回のコードも、まだ、ラウンジの質疑応答となる反応ができるほど理解までいってないので、中身はあるレスはもう少しかかりそうです(^^;;;

#チャット状態回避のために黙ってるのも失礼なので、思考中という報告でありました(_ _)

[上に] [前に] [次に]