• ベストアンサー

メソッドが返す型を調べるにはどうしたらよいのでしょうか?

メソッドが返す型(配列、スカラー、ハッシュ、リファレンスなど)を調べるにはどうしたらよいのでしょうか? どなたかご存じの型教えていただけると嬉しいです _ _

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

メソッドの場合で検証してみました。 ----検証プログラム---- use strict; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; $Win32::OLE::Warn = 3; my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); my $Book = $Excel->Workbooks->Open('C:\TEMP\001.xls'); my $Sheet = $Book->Worksheets(1); my $ret = $Sheet->Range("A1:B3")->{'Value'}; # これを調べたい my $ref_ret = \$Sheet->Range("A1:B3")->{'Value'}; print "1:".ref($ret)."\n"; print "2:".ref(\$ret)."\n"; print "3:".ref($ref_ret)."\n"; print "4:".ref(\$Sheet->Range("A1:B3")->{'Value'})."\n"; $Book->Close; ----結果---- 1:ARRAY 2:REF 3:SCALAR 4:SCALAR これの正解は2番のREFです。 でも、2番の方法も完璧ではないと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

#2です。ちょっと補足です。 実際は、わざわざリファレンス用の変数を用意しなくても良いです。 >perl -e 'print ref( \$a )' SCALAR

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

一度リファレンス変数に入れれば、「ref」で調べられます。 >perl -e '$ref = \$a ; print ref( $ref )' SCALAR >perl -e '$ref = \@a ; print ref( $ref )' ARRAY >perl -e '$ref = \%a ; print ref( $ref )' HASH

全文を見る
すると、全ての回答が全文表示されます。
  • urdapple
  • ベストアンサー率30% (9/30)
回答No.1

うろ覚え・・・ [戻り]=ref([式]); でダメでしたっけ? 「REF」が返ればリファレンス 「SCALAR」ならスカラー変数 「ARRAY」なら配列 「HASH」ならハッシュ だったような・・・現状確認できる環境がないので、参考程度に・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • レコードセットを配列のハッシュ形式で返すメソッド

    DBI.pmのメソッドで、 selectall_arrayref()は配列の配列形式、 selectall_hashref()はハッシュのハッシュ形式でレコードセットを返しますが、 配列のハッシュ形式で返すメソッドは存在するのでしょうか。 ハッシュのキーは列名として、 ハッシュの値はORDER BY句で指定したとおりに整列された配列へのリファレンスとなるような、ハッシュを生成しようとしています

    • ベストアンサー
    • Perl
  • リファレンスをサブルーチンの戻り値にしてもOKですか?

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

    • ベストアンサー
    • Perl
  • 配列から他タイプの配列に変換するメソッドについて。

    様々な型の変換を探しては実行していますが、 配列同士の変換するメソッドはありますでしょうか? 検索しても見つからなかったので、作るしかないのかなとは思っているのですが、 あれば、教えていただけるとうれしいです。

    • ベストアンサー
    • Java
  • メソッド宣言の戻り値の型にクラス名を使うには?

    メソッドの戻り値の型にクラス名を使ってるプログラムを見かけたのですが、例えばクラス名を public class Player{ とします。そして Playerクラスのメソッド宣言に  private   Player(戻り値の型) startRun(メソッド名) { とあります。 これは戻り値の型にクラス型の変数を使ってユーザー定義してると思うのですが使い方が分かりません。 javaのサイトはできるだけ調べたのですが戻り値の型にクラス名を使うにはどうすればいいか分かりませんでした。 この使い方を教えてくれるサイトを教えてください。 基本型と参照型のStringクラスについて教えてくれるサイトはたくさん見かけたのですが…。 お願いします。

    • ベストアンサー
    • Java
  • uasort()でクラスのメソッドは呼べますか?

    2次元連想配列の指定項目をソートするのに、uasort()を使いたいのですが、 uasort()で指定する関数に任意の引数は渡せず、固定の項目しかソートできません。 uasort($rensouArray,"comparar"); 関数ではなくクラスのメソッドが指定できば引数を渡せなくてもクラスのプロパティで渡せると思いましたが、 以下の書き方ではクラスのメソッドは呼べませんでした。 uasort($rensouArray,$this->$comparar()); http://jp.php.net/manual/ja/function.uasort.php の注意書きで、関数名の代わりに、オブジェクトへのリファレンスを格納した配列とメソッド名を指定することも出来ます。とありますが、書き方がわからず困っています。

    • 締切済み
    • PHP
  • MVC C# 共通メソッドはどこに書く?

    MVC C# でWebアプリの開発を勉強していますが、共通メソッド(共通処理)はどこに書きますか。 例えば、LoginControllerはログイン画面の処理で、UserControllerは新規ユーザ作成の処理で、二つのコントローラーはパスワードハッシュ処理メソッドを使います。パスワードハッシュ処理メソッドはどこに書くか詳しく教えていただけませんでしょうか。

  • arraycopyメソッド

    ある問題集なのですが・ String a = "String"; String b = "copy"; System.arraycopy(a,0,b,4,6); でaとbがどうなるかというのですが、 プログラムが実行できません。 コンパイルは出来るのですが、 ArrayStoreExceptionの例外が出ます。 型違い、ということなんですけれど・・・ リファレンスを見ると >以下のどれかの場合は、ArrayStoreException をスローし、転送先を修正しません。 >引数 src が、配列でないオブジェクトである >引数 dest が、配列でないオブジェクトである とあります。 aとbがStringだから悪いのでしょうか?? 問題自体が間違っているのでしょうか??? どうやったら実行できるようになりますか??? ちなみに答えは a="String" b="copyString" だそうです。

    • ベストアンサー
    • Java
  • [perl]メソッドの引数で受け取った配列データを直接編集したい

    現在、業務でperlプログラムを書いてます。 perlを初めて2か月、プログラムは ほぼ初です。 よろしくおねがいします。 例えば以下のようなコードで、「sub_func」というメソッド内で「main」メソッド内の配列データを直接編集したいのですが、うまくいきません。 これは、引数で渡しているのは配列の「ポインタ」ではなく「リファレンス」であるため、「sub_func」というメソッド内で、新たに「array_ref」という配列の実態を作成してしまっているのだと認識しています。 そのため、「main」メソッドに戻ったタイミングではデータは元に戻ってしまうのだと思っています。 sub sub_func {    my ($self, $array_ref) = @_ ;    $array_ref = [4,5,6];   # returnはせずに、引数で指定したデータに格納したい } sub main {    my ($self) = @_ ;    # メソッドに渡すデータ    my $data = {       array => [1,2,3],    };    my $data2 = [1,2,3];    my @data3 = (1,2,3);    # メソッドの中で、$data->{array}を [4,5,6] に変えたいが・・・    $self->sub_func( $data->{array} );    $self->sub_func( $data2 );    $self->sub_func( \@data3 );    # この時点で、どれも [1,2,3] のまま } 私の認識は間違っているのでしょうか?? また、どのようにすれば配列の要素を別のメソッド内で編集できるのでしょうか?? 御助言をお願いします。

    • ベストアンサー
    • Perl
  • Perl 戻り値の型の判定って出来ますか?

    Perlは引数でのOUTを返せないと認識してます。 ※ここで間違っていたらご指摘下さい。 そのために下記のように、違った型(スカラー変数または配列)を返すように切り替えた場合に呼び側はどのように判定すれば良いのでしょうか?教えて下さい。 $result = sample(); sub sample{ $abc = "abc"; @xyz = qw(x y z); if(){ return $abc; } if(){ return @xyz; } return 0; }

    • ベストアンサー
    • Perl
  • ハッシュのリファレンスを用いた処理

    ActivePerl 5.8 , WinXP SP2の環境です。 Perl スクリプトを用い、ファイルから複数のブロックからなる情報をよみとり、個別のハッシュを作り、それをリファレンスの配列としてまとめて後から参照するという操作をしたいのですが、詰まってしまいました。。 例として読み取るファイルは ---input.txt--------- >1 Jan 1 Feb 4 >2 Mar 9 Apr 3 >3 Oct 8 Nov 4 ------------------ ここから1,2,3の個別のハッシュ {Jan => 1 Feb => 4} {Mar=> 9 Apr =>3} {Oct =>8 Nov =>4} を作成し、それぞれのハッシュのリファレンスの配列をつくり、その後からすべてのハッシュの中身を個別に出力させたいと思いました。 次のようなスクリプトを作成したのですが思ったように作動しません。 use strict; open (IN, "input.txt") or die ("cant open file \n"); my $reff; my @array_of_reff; my %hash; my $count = 0; while(<IN>){ my $line = $_; ######ここでは各ブロックの頭の ">"を認識し、2個目以降であれば直前までで作ったハッシュのリファレンス($reff)を配列@array_of_reffに入れる。 if($line =~ /^>/){ if($count >0){ $reff = \%hash ; push (@array_of_reff, $reff); %hash = (); } $count++; } ########ここではアルファベットが入った行を認識して、ハッシュに追加しています if($line =~ /^[A-Za-z]/){           $line =~ /([A-Za-z]+)\s+/; my $month = $1; $line =~ /\s+(\d+)/; my $day= $1; $hash{$month} = $day;     } ###ここはファイルの最後になったら直前まで作っていたハッシュののリファレンス($reff)を配列@array_of_reffに入れる。 if( eof ){ $reff = \%hash ; push (@array_of_reff, $reff); } } #####ハッシュのリファレンスの配列(@array_of_reff)からもとのハッシュを参照し、ハッシュごとに出力 foreach my $reff_of_hash (@array_of_reff){    print "output";    while( (my $key,my $value) = each %$reff_of_hash ){     print "\n" , $key, " : ", $value, ;    } } このスクリプトを実行すると Nov 4 Oct 8 という3つめのハッシュのなかみが3回出力されてしまいます。自分では3つの別のハッシュをつくっているつもりでも、どうやら1種類しか作れていない、もしくはハッシュが上書きされているようなのですが、原因がわかりません。 この例だけ見るとハッシュのリファレンスを使う必要はないのですが、実際にはもうすこし大きいスクリプトで"ハッシュのリファレンスの配列を他のサブルーチンに渡す"ということを想定しており、これが解決できず先に進めない状態です。 アドバイス、解決法がわかったら教えていただけないでしょうか。

    • ベストアンサー
    • Perl