CGI-BBS > CGI > Perl > 関数での引数の区別


カレッヂ
カレッヂ


質問者 マグ  投稿日 5/4(土) 09:35:20
よろしくお願いします。
関数内で引数を区別しようとテストしてみました。

=============================================
@List1 = (1,2,3);
$Scalar = 4;
@List2 = (5,6,7);

&Test(@List1, $Scalar, @List2);

sub Test {
        my (@dat1, $dat2, @dat3) = @_;
        print "@dat1 \n $dat2 \n @dat3 \n";
                
}

上の例ではすべての引数が @dat1 に入ってしまい
どこまでが @List1 の値か区別できません。
引数を区別して受け取りたい場合どのようにするのでしょうか?
初歩的な質問と思いますがよろしくお願いします。

回答者 今夜はやすだ  [削除]  投稿日 5/4(土) 23:48:57
リストを引数に取る場合、どうしてもこんな問題が起こります。
私の場合、こんなとき、リファレンスを使います。少々ややこしくなりますがなれれば大丈夫なはずです。

&Test(\@List1,$Scalar,\@List2);

sub Test{
        my @dat1=@{shift()};
        my $dat2=shift;
        my @dat3=@{shift()};
        print "@dat1\n$dat2\n@dat3\n";
}
質問者 マグ  [削除]  投稿日 5/5(日) 17:57:10
ご返答ありがとうございました。
レファレンス=ポインタのような感じですね。
早速、使ってみます。
ところで他にも調べましたら
型グロブで
Test(*List1, *Scalar, *List2);

sub Test {
  local (*dat1, *dat2, *dat3)= @_;
  print "@dat1 \n$dat2 \n@dat3 \n";
}
でもOKでした。
なぜか my だとエラーになるのは?です。
レファレンスを使用した方がいいみたいです。
回答者 今夜はやすだ  [削除]  投稿日 5/5(日) 23:33:20
型グロブなら、次のようにして、渡せばいいのでは?関数内でのlocalが仕方ないでしょうが。

&Test(\@List1,\$Scalar,\@List2);

返信(回答)する


Web裏技