下記フォームに必要事項を入力後、確認ボタンを押してください。
(1)サブルーチンの定義 スクリプトが大きくなると同じルーチン(命令の集まり)が何箇所にも現れることがあります。そのため、共通して使えるプログラムをおくことで効率的且つ綺麗なプログラムにすることが可能です。この共通に使えるスクリプトをサブルーチンと呼びます。 @ サブルーチン記法 サブルーチンは予約語subを用いて定義します。 ● sub サブルーチン名{ 命令1 命令2} A サブルーチンの呼び出し サブルーチンの呼び出すにはサブルーチンの前に&をつけます。 ● &サブルーチン名
#サブルーチンの呼び出し &hello; #サブルーチンの定義 sub hello{ print "Hello"; }サブルーチンからサブルーチンを呼び出す場合は次の通りです。
&hello; サブルーチンhelloの定義 sub hello{ print "Hello"; &hello2; サブルーチンhello2の呼び出し } sub hello2{ print "TARO\n"; }A 変数を引数として渡す場合
#数字をキー入力する print "数字を入力して下さい:"; chomp($num1=B サブルーチンでリストを返す サブルーチンs_subを呼び出し、その戻り値リストを配列@xに代入するプログラムです。); print "数字を入力して下さい:"; chomp($num2= ); サブルーチンFの呼び出し &F($num1,$num2); サブルーチンFの定義 sub F{ $m=$_[0]*$_[1]; print "$_[0]*$_[1]=$m"; }
@x=&s_sub(200,199,60,50); #結果の表示 print "s(200)=@x[0]\n"; print "s(199)=@x[1]\n"; print "s(60)=@x[2]\n"; print "s(50)=@x[3]\n"; #サブルーチンs_subの定義 sub s_sub{ $a=s_sub $_[0]; $b=s_sub $_[1]; $c=s_sub $_[2]; $d=s_sub $_[3]; return($a,$b,$c,$d); }
●グローバル変数(global): | スクリプト全体で有効 |
●ローカル変数(local): | 定義したサブルーチン内と呼び出したサブルーチン内で有効 |
●my関数で定義(my): | 定義したサブルーチン内だけで有効 |
$a=300; $b="xyz"; print "a=$a,b=$b 初期値\n"; &pri;#サブルーチンpriの呼び出し print "a=$a,b=$b サブルーチン呼び出し後の値\n"; #サブルーチンpriの定義 sub pri{ my $b;#myは定義したローカル内だけで有効なローカル変数 $a=400; $b="abc"; print "a=$a,b=$b サブルーチン内での値\n"; }(2)値渡しと参照渡し @ 参照渡し サブルーチンに渡された引数は,$_[0],$_[1]に格納されますが、$_は引数の変数の場所を直接指している変数なので、$_の内容を書き換えると呼び出し元の変数の値がかわってしまいます。このような引数の渡し方を参照渡しとよびます。
$n=100; print "n=$n サブルーチン呼び出し前\n"; &conv($n);サブルーチンの呼び出し print "n=$n サブルーチン呼び出し後\n"; サブルーチンの定義 sub conv{ $_[0]=500; }このプログラムでは次のように出力されます。 n=100 サブルーチン呼び出し前 n=500 サブルーチン呼び出し後 A 値渡し 対して$x=$_[0];を実行すると$_[0]のコピーがローカル変数$xに代入します。その結果$x=30を実行してもグローバル変数$nに影響を与えることはありません。このような引数の渡し方を値渡しと呼びます。
$n=100; print "n=$n サブルーチン呼び出し前\n"; &dainyu($n);サブルーチンの呼び出し print "n=$n サブルーチンの呼出し後\n"; sub dainyu{ my $x=$_[0]; print "x=$x サブルーチンの呼出し中\n"; $x=500; print "x=$x サブルーチンの呼出し時\n"; }このプログラムでは次のように出力されます。 n=100 サブルーチン呼び出し前 x=100 サブルーチンの呼出し中 x=500 サブルーチンの呼出し時 n=100 サブルーチンの呼出し後