渡された引数の型を判別する

このQ&Aのポイント
  • ブレークポイント用にサブルーチンを作成しました。
  • 引数が連想配列の場合、表示順が毎回異なります。
  • サブルーチン側で変数の型を判別し、コードを書き分けることは可能でしょうか。
回答を見る
  • ベストアンサー

渡された引数の型を判別する

ブレークポイント用に以下のようなサブルーチンを作ってみました。  sub bp {  if(not defined $_[0]){return};     open(OUT,">>$bpfile") || err('ファイルが開けません。bp');  eval{flock(OUT,2)};     my $num=@_-1;  print OUT $_[0];   for my $i(1..$num) {   print OUT "\t".$_[$i];   }  print OUT "\n";     close(OUT);  } ただ  bp(); と記述すれば何もせず、本当にただのブレークポイントですが、引数に変数を持ってくれば、その位置での変数の値をファイルに記録してくれます。 ただ引数が連想配列だった場合、キーや値が表示される順番が毎回違うので使い勝手に難があります。変数の型をサブルーチン側で判別して、コードを書き分けることは出来ないでしょうか。

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

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

単純に連想配列を渡すだけではだめ (複数のスカラーを渡すのか配列を渡すのか連想配列を渡すのかの区別がつかない) だけど, 参照を渡すことにすればできます. 受け取った方では ref を使って「何が渡されたのか」を知る.

makoji
質問者

お礼

ありがとうございます。 うまく分岐できました。

関連するQ&A

  • evalの使い方 引数として式を与える

    引数として与えた式を、プログラム中で計算するようにしたいと思っています。 引数に変数を入れることはできないのでしょうか? 将来的には、ファイルを開いてそれぞれの、ファイルごとの定数を式に代入しようと考えています。 よろしくお願いします。 プログラム ################################### my $bb =2; my $str = $ARGV[0]; eval $str; print "$str\n"; 実行文 #################################### perl test.pl 2*3+\$bb 結果 #################################### 2*3+$bb 望んでいる結果 8

    • ベストアンサー
    • Perl
  • C++/Cこういうことは可能でしょうか?違う型の引数をとって同じようなことをする

    お世話になります。 C++の初心者です。 違う引数をとって同じ関数にいれて同じようなことをさせるというのは できるのでしょうか? コンストラクタの作成方法で可能?? 共用体で可能?? 例: 型の違う構造体A,Bがある。 構造体のメンバには同じstatusが存在する。 statusが1のときだけresultを+し値を返す。 typedef struct{   int status;   int b; } DATA_A; typedef struct{   int status;   int b;   int c; } DATA_B; int test(DATA_AかDATA_Bを引数でとる,int data_num){ //data_numはデータ数  int i=0;  int counter=0;  for(i=0;i<data_num;i++){   //DATA_AまたはDATA_Bのメンバstatusが1ならcounterを+する   if(DATA_A.status == 1){    counter++;   }  }  return counter; } 以上のような感じです。 引数の型が違う2つの関数を作ればできますが、 同じことをさせるので同じ関数で実現できないかなと思って 質問させてもらいました。 よろしくおねがいします。

  • 引数別の例外処理

    (1)コマンドラインの1つ目の引数を整数に変換して、int型の変数num1に代入。 (2)コマンドラインの2つ目の引数を整数に変換して、int型の変数num2に代入。 (3)num1とnum2の掛け算結果を標準出力。 (4)例外「NumberFormatException」が発生した場合は、“○(引数の例外発生した方の値)は整数に変換できません”の文字列を標準出力し、プログラム終了。 という問題で、NumberFormatException の○の部分の表示の仕方を教えて下さい。

    • ベストアンサー
    • Java
  • 配列を引数とするサブルーチンに関する質問

    配列を引数とするサブルーチンに関する質問です。 Trimと Hex2Decのサブルーチンをインターネットを参考に作りました。 下記のスクリプトは > perl test.pl で期待通りに動きます。 質問は、サブルーチンの中における、 for (@out) { $_=hex; } です。 trimの方では、$_がなくても、きちんと動きます。(あってもOK、$_=~s/^\s+//; $_=~s/\s+$//;) Hex2Decの方は、$_=hex; でないと動きません。 これは、for (@out) { }でひとつずつ処理する対象が、$_に入っている。 処理結果の格納先が、s/^\s+//; の場合は、記述無き時は、 $_と暗黙できまっているのに対し、 hex;の場合は、そうではない。明示的に与えてやらなければいけない。 こういう理解で、良いでしょうか? 他に、やりようはあるのでしょうか? 宜しくお願いいたします。 test.pl ----------------------------------------- $a=10,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n"; $a=20,print "Hex=".$a." --> Dec=".&Hex2Dec($a)."\n"; @a=('a','b','c','d'); @b=&Hex2Dec(@a); print "Hex=@a --> Dec=@b\n"; $a=' a ',print "org=$a --> trimed =".&trim($a)."xxxxx\n"; $a=' b ',print "org=$a --> trimed =".&trim($a)."xxxxx\n"; @a=(' a ',' a ',' a ',' a '); @b=&trim(@a); print "org=@a --> trimed= @b\n"; sub trim { my @out = @_; for (@out) { s/^\s+//; s/\s+$//; } return wantarray ? @out : $out[0]; } sub Hex2Dec { my @out = @_; for (@out) { $_=hex; } return wantarray ? @out : $out[0]; } ------------------------------------------------

    • ベストアンサー
    • Perl
  • コマンドライン引数で正規表現を指定したい

    Perlでgrep -Aのようなことがしたいです。 ---------------grep.pl------------------------------- use strict; use warnings; #コマンドライン引数の確認 if(@ARGV != 3){ die "USAGE: \0 [num] [regex] [file]"; } #数字の読み込み my $num = $ARGV[0]; #正規表現の読み込み my $regex = qr/$ARGV[1]/; #ファイル名の読み込み my $file = $ARGV[2]; #該当行を保存する配列 my @lines = (); open my $fh, '<', "$file" or die "$!"; my @file = <$fh>; close $fh; for(my $i=0; $i<@file; $i++){ if($file[$i] =~ /$regex/){ push @lines, $file[$i]; for(my $j=1; $j<=$num; $j++){ if($i+$j < @file){ if($file[$i+$j] !~ /$regex/){ push @lines, $file[$i+$j]; }else{ last; } }else{ last; } } } } foreach my $item (@lines){ print $item; } ------------------------------------------------- ところが、正規表現がうまく読み込めません。 perl grep.pl 2 \d{4}\/\d{2}\d{2} test.txt などとしても、\d{4}\/\d{2}\d{2}の部分が機能しません。 コマンドライン引数から正規表現を指定するにはどうしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • ラジオボタンの値を取得する引数付き関数を作りたい

    フォームの入力内容をチェックするJAVASCRIPTの関数を作成していますが、ラジオボタンのValueを取得することができません。 引数指定の関数を作成して汎用的に使用したいと考えているのですが、引数を渡すと値を返してくれません。 引数の渡し方がおかしいのでしょうか? function getRadioValue(str){ // 値を取得する関数 var check, num, value="none"; num=document.form1.str.length; for (i=0;i<num;i++) { check=document.form1.str[i].checked; if (check) value=document.form1.str[i].value; } return value; } function check(){ // 入力内容をチェックする if (getRadioValue("タイプ") == "A"){ hogehoge } : : }

  • java初心者です。

    java初心者です。 イクリプスを使って、以下文のようなプログラムを実行しようとしたのですが、何度も「エディターにはメイン型が含まれていません」という画面が出てきて実行してくれません。 分かりやすい解決策をお待ちしています。よろしくおねがいします。 1class Sample1 2{ 3public static void main(String args[]) 4{ 5int num1=2; 6int num2=3; 7int sum =num1+num2 8 9System.out.prtintln("変数num1の値は"+num1+"です。"); 10System.out.prtintln("変数num2の値は"+num2+"です。"); 11System.out.prtintln("num1+num2の値は"+sum+"です。"); 12 13num1= num1+1; 14 15System.out.prtintln("変数num1の値に1をたすと"+num1+"です。"); 16} 17} 以上

  • Perlです。サブルーチンについて

    以下の文はあっていますでしょうか。 # サブルーチンを呼び出して引数は 3 とする。 # そして返ってきた戻り値を変数$aに代入せよ。 $a=&a(3); # サブルーチン名aせよ。 sub a{ # $_[0]が引数 3 となりプラス1して変数$bに代入せよ。 $b=$_[0]+1; # 変数$bの内容を戻り値として返せ。 return $b; } # 変数$aの内容を表示せよ。 print "$a";

    • ベストアンサー
    • Perl
  • 親クラスの型で子のオブジェクトを扱う

    ●下記のコードについての質問となります class Y { int num2 = 20; } class Z extends Y { int num3 = 30; } class Sample{ public static void main(String args[]){ --------------------------------------------- Y y1 = new Z(); --------------------------------------------- System.out.println(y1.num2); System.out.println(y1.num3); } } 「-----」で囲まれている部分になりますが、 親クラスの型で子のオブジェクトを扱おうと思うのですが、 「System.out.println(y1.num3);」 この部分において、コンパイルエラーとなります。 Zクラスから生成されたオブジェクトへの参照を Y型変数y1に代入していると思うのですが、 何故、「y1.num3」の値が表示されないのかを ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ お伺いしたいと思っております。 以上、宜しくお願い致します。

    • ベストアンサー
    • Java
  • for文の実行結果について

    public class Trace2 { public static void main (String[] args) { int i; int num; num = 1; for (i = 0; i < 10; i++) { num += num; } System.out.println("iの値は" + i); System.out.println("numの値は" + num); } } 実行結果は iの値は10 numの値は1024になります。 何故こうなるのですか?

    • ベストアンサー
    • Java