こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

perlでサブルーチンへの複数の配列渡し

perlでサブルーチンに配列を渡しているのですが、
引数としている配列が1個の場合は問題ないのですが、
複数渡すと、第2引数以降が渡りません。

どの様にすれば上手くできますか。


例1
#!/usr/bin/perl

@x1 = (14, 11, 5, 12, 8, 15);
@x2 = (12, 10, 8, 9);

print "main : @x1 \n";

&test(@x1);

sub test {
my (@arg1) = @_;

print "sub : @arg1 \n";
}

結果
main : 14 11 5 12 8 15
sub : 14 11 5 12 8 15


例2
#!/usr/bin/perl

@x1 = (14, 11, 5, 12, 8, 15);
@x2 = (12, 10, 8, 9);

print "main : @x1 \n";
print "main : @x2 \n";

&test(@x1, @x2);

sub test {
my (@arg1, @arg2) = @_;

print "sub : @arg1 \n";
print "sub : @arg2 \n";
}

結果
main : 14 11 5 12 8 15
main : 12 10 8 9
sub : 14 11 5 12 8 15 12 10 8 9
sub :

引数1に全てが設定されて、引数2に設定されていない。

投稿日時 - 2016-11-22 10:40:57

QNo.9258785

困ってます

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

ご参考
http://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/array_argument.html

上記のように「@_」は「呼ばれた先で、引数の切れ目が判らなくなる」ので、@arg1に「すべての値が全部入る」事になります。

回答ANo.1のように「リファレンスを渡す」と「呼んだ先で変数を書き換えると、呼び出し元の値も変わってしまう」と言う事に注意して下さい。

投稿日時 - 2016-11-22 11:53:02

お礼

ありがとうございます。

ご説明と参考となるURL参考になりました。

投稿日時 - 2016-11-24 08:36:27

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

こんにちは
コード、間違っているかも知れませんが、リファレンスを使って
#!/usr/bin/perl
@x1 = (14, 11, 5, 12, 8, 15);
@x2 = (12, 10, 8, 9);
&test(\@x1, \@x2);
sub test {
my ($arg1, $arg2) = @_;
print "sub : @$arg1 \n";
print "sub : @$arg2 \n";
}
のような感じでいけるようです。
環境無いので試してません。

投稿日時 - 2016-11-22 11:22:42

お礼

ありがとうございます。

リファレンスを使ってできました。

投稿日時 - 2016-11-24 08:35:10

あなたにオススメの質問