(1)サブルーチンの定義 スクリプトが大きくなると同じルーチン(命令の集まり)が何箇所にも現れることがあります。そのため、共通して使えるプログラムをおくことで効率的且つ綺麗なプログラムにすることが可能です。 この共通に使えるスクリプトをサブルーチンと呼びます。 ●サブルーチン使用[sub サブルーチン名{ 命令1 命令2}] サブルーチンは予約語subを用いて定義します。 ●サブルーチンの呼び出し サブルーチンの呼び出すにはサブルーチンの前に&をつけます。 &サブルーチン名
#サブルーチンの呼び出し &hello; #サブルーチンの定義 sub hello{ print "Hello"; }(2)サブルーチンからサブルーチンを呼び出す
&hello; サブルーチンhelloの定義 sub hello{ print "Hello"; &hello2; サブルーチンhello2の呼び出し } sub hello2{ print "TARO\n"; }(3)変数を引数として渡す
#数字をキー入力する print "数字を入力して下さい:"; chomp($num1=(4)サブルーチンでリストを返す サブルーチン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); }
$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=20; print "n=$n サブルーチン呼び出し前\n"; &conv($n);サブルーチンの呼び出し print "n=$n サブルーチン呼び出し後\n"; サブルーチンの定義 sub conv{ $_[0]=30; }対してmt $x=$_[0];を実行すると$_[0]のコピーがローカル変数$xに代入します。その結果$x=30を実行してもグローバル変数$nに影響を与えることはありません。このような引数の渡し方を値渡しと呼びます。
$n=10; print "n=$n サブルーチン呼び出し前\n"; &conv($n);サブルーチンの呼び出し print "n=$n サブルーチンの呼出し後\n"; sub conv{ my $x=$_[0]; $x=30; print "n=$n サブルーチンの呼出し時\n"; }