• ベストアンサー

perlで関数のプロトタイプでリファレンスの場合は?

perlで関数にプロトタイプを記述しようとしたのですが、リファレンスの場合はどうしたらよいのでしょうか? sub test(\$[ここに必ずリファレンス型]){ my($sca, $ref) = @_; } my $a = "A"; my @b = ("1", 2, "3"); test($a, \@b);

  • Perl
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • maura
  • ベストアンサー率46% (48/104)
回答No.1

関数の使用法が少し変わってしまいますが。。 sub test($\@){ my($sca, $ref) = @_; print $sca, @{$ref}[2]; } my $a = "A"; my @b = ("1", 2, "3"); test($a, @b);

tanaka22
質問者

補足

私の勘違いかもしれませんが、 リファレンス型は \$や\@や\%が正解ということでしょうか? プロトタイプに \$を付けると、受け取ったサブルーチン内の変数ではすべて頭に¥がついていました。 \$はてっきり、スカラー必須という意味でなく、スカラーのリファレンスという意味が正しいと理解し、データ型を特定するという意味は間違いやすいので¥が付けばリファレンス型と断言してもよいのでしょうか? 間違っていましたら、ご指摘ください。

関連するQ&A

  • Perlの関数の引数について詳細

    perlで引数に関することでわからないことがあるのですが、以下の状態で、実行した際に、$aは1が入るのはわかりますが、$bには具体的にどんな値が入っているのでしょうか? 引数が無い場合は、デフォルトで1をセットしたいです。 phpのvar_dump関数のようなものがPerlには存在すれば便利ですが、そういうものはあるのでしょうか? sub test{ my ($a, $b, $c, $d) = @_; } &test(1); あと引数の数を2つは必須にして、残りの引数(3つ目はデフォルトで1つ目の引数と同じ値になり、4つ目以降はデフォルトで1となる 関数のプロトタイプを書きたいのですが、どうですればよいのでしょうか? sub test($$;@  ?のようなものを見たことがあるのですが、どんな意味をしているのでしょうか?結構複雑な引数を持たせることができそうなのですが、詳しく書かれている本などご存知の方教えてください。

    • ベストアンサー
    • Perl
  • perlのリファレンス

    Perlのクラスとそのインスタンスについて疑問があります。 newでインスタンスを生成して、それを代入した場合には オブジェクトはコピーされるのでしょうか? $a = new MyClass; $b = $a; # aをコピーしてbを作る? この状態の時にaとbが同じインスタンスを指しているのか、 コピーされた別のインスタンスを指しているのかわかりません。 コピーされるとして、逆にコピーしない方法はありますか? PHPでいうと以下の書式のことがしたいのです。 $b =& $a; リファレンスを使えばできそうですが、なんだか2回コピーしている ような気がします。 $ref_b = \$a; $b = $$reb_b; PHPでいう is_a のような関数が見つけられなかったので、 どうやって上記のことを確認すればよいのかわかりません。 Perlの代入はすべてコピーと考えてよいでしょうか? アドバイスなどいただけると幸いです。

    • ベストアンサー
    • Perl
  • プロトタイプ宣言のワーニングについて

    関数のプロトタイプ宣言と、それに関するwarningsプラグマについてお教えください。 関数のプロトタイプ宣言は、その関数を呼び出す側がコンパイルされる時点で、すでに存在する必要があり、また、use warningsによってプラグマを有効にしておくと、遅いプロトタイプ宣言について警告してくれると理解していました。 以下の2例は、どちらもプロトタイプ宣言が遅いために、うまくプロトタイプが働かない例です。 しかし、(例1)ではwarningが表示されるのに対し、(例2)では表示されません。 どこか私の理解が誤っているのかと思うのですが、このようになる理由についてご教授いただきたく、よろしくお願いいたします。 ■ (例1) #!/usr/bin/env perl # -*- mode: cperl; coding:utf-8 -*- use strict; use warnings; my @a= 1..4; mypush( @a, 5..8); print join( ",", @_), "\n"; sub mypush(@@){ if( @_== 2){ print "ok.\n"; }else{ print "Prototypes does not work, arg. num=", 0+ @_, "\n"; } } □(出力1) main::mypush() called too early to check prototype at ./chk_prototype.pl line 10. Prototypes does not work, arg. num=8 ■(例2) #!/usr/bin/env perl # -*- mode: cperl; coding:utf-8 -*- use strict; use warnings; test_2(); exit 0; sub test_2{ my @a= 1..4; mypush( @a, 5..8); print join( ",", @_), "\n"; } exit 0; sub mypush(@@){ if( @_== 2){ print "ok.\n"; }else{ print "Prototypes does not work, arg. num=", 0+ @_, "\n"; } } □(出力2) Prototypes does not work, arg. num=8 ---- なお、Perlは、 perl -v This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi を使用しております。

  • Perlの本家のリファレンスは?

    Perlの本家のリファレンスはあるのでしょうか? 個人の方が運営されているPerlリファレンスのページはあるのですが、 本家の、http://www.perl.org/ には、そのようなページが見つかりませんでした。 関数リファレンス、文法などについて正式なページをご存知の方いらっしゃましたら教えていただけないでしょうか。

  • perlのリファレンス?はPHPではどうするのでしょうか?

    以下、Perlのソースですが、これをPHPに直すとどうなるのでしょうか? use strict; use warnings; use Data::Dumper; my $Name = "テスト"; my $Width = "100"; my $Height = "200"; my $dat = [ $Name, { Width=>$Width, Height=>$Height, } ]; print Dumper($dat); sub test{ my ($aryref) = @_; $$aryref[0]{$Name}{"Width"} = $Width; $$aryref[0]{$Name}{"Height"} = $Height; } my @OBJ = (); test(\@OBJ); print Dumper(@OBJ);

    • 締切済み
    • PHP
  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • プロトタイプの関数から、別のプロトタイプの関数を呼出すには?

    javascript初心者ですが、オブジェクトに関してわからないことがあるので、教えてください。(とんちんかんな質問かもしれませんが、ご容赦下さい。) 下記のような場合、関数calから関数setを呼出すのはどうすればよいのでしょうか? function Obj(){ } Obj.prototype.set = function(){ } Obj.prototype.cal = function(){ ここから、setを呼出すにはどうすればよいのでしょうか? } var obj = new Obj();

  • Perlの戻り値について

    配列の戻り値が理解できていないのですが、 Perlで正しく動作させるためには どのように記述したら良いのでしょうか? 戻り値の動作を詳しく書いてある(出来れば図入りで) 本はありますか? 例) sub a { my @a = ('A'); return (@a, "B", 2); } my (@a, $b, $c) = &a; print "a=[@a] b=[$b] c=[$c]\n"; # a=[A] b=[B] c=[2] # これを期待していたが # a=[A B 2] b=[] c=[] # こちらになる

    • ベストアンサー
    • Perl
  • perlのeach関数の動き?

    perl5.8ですがeach関数を使って何回か動かすと、ハッシュ内にあるはずのデータが取得できなくなります。 my %hash = ('a'=>100, 'b'=>50); for(1..100){ while( my ($k, $v) = each %hash ){ if($k eq 'a'){ ... 通過しなくなる。 } } } PHPでは、配列に対してですが、reset関数というものがありますが perlでは、何か対策でもあるのでしょうか? 現在は、keys関数で代用しています。 eachでループは無理なのでしょうか?

    • ベストアンサー
    • Perl
  • Perlのリファレンスとアロー演算子について

    Perlの勉強をしています. リファレンスとアロー演算子について教えて下さい. ■質問 下記のうち,(4)がどのように評価されるか教えて下さい. 先頭のシャープはプロンプトです. (1) よくある配列要素の指定方法 # perl -e '@a = (0,1,2,3); print($a[1]);' →1 (2) あまりよろしくないが,スライスを使っても,print文では@a[1]がリストのコンテキストで評価されるので同じ結果にはなる # perl -e '@a = (0,1,2,3); print(@a[1]);' →1 (3) よくあるリファレンス/デリファレンスの方法 # perl -e '$a = [0,1,2,3]; print($a->[1]);' →1 (4) 下記が成り立つ意味が分からない # perl -e '@a = (0,1,2,3); print(@a->[1]);' →1 @aは配列であってリファレンスでは無いと思うのですが,配列にアロー演算子が使えてしまっていいんでしょうか? Perl5のマニュアルによれば(http://www.namazu.org/~tsuchiya/perl/info/perl-ja_20.html),アロー演算子は「右側が [...] か {...} の形の添字であれば、左側は配列かハッシュへのハードリファレンスかシンボリックリファレンス」と書かれているので,左側が配列そのものであるときは,エラーになるのではないかと思うのですが... 分かる方,どなたかご教授いただければ幸いです. ■環境 # perl -v This is perl, v5.10.1 (*) built for i686-cygwin-thread-multi-64int (with 13 registered patches, see perl -V for more detail) Copyright 1987-2009, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.

専門家に質問してみよう