004.Perl SubRoutine

(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=);
print "数字を入力して下さい:";
chomp($num2=);
サブルーチンFの呼び出し
&F($num1,$num2);
サブルーチンFの定義
sub F{
	$m=$_[0]*$_[1];
	print "$_[0]*$_[1]=$m";
}
(4)サブルーチンでリストを返す  サブルーチンs_subを呼び出し、その戻り値リストを配列@xに代入
@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);
}

004.グローバル変数とローカル変数

(1)ローカル変数  スクリプト全体で有効な変数をグローバル変数と呼びます。一方でサブルーチン内だけで有効な変数をローカル変数と呼びます。perlでは特に指定しなければグローバル変数として扱われます。一方でローカル変数はサブルーチン内でmy関数またはlocal変数で定義します。my関数で定義したローカル変数とlocal関数で定義したローカル変数の違いは、「local関数」は定義したローカル変数はサブルーチン内と呼び出したサブルーチン内で有効であり、my関数で定義した場合は、定義したサブルーチン内だけで有効です。
グローバル変数:スクリプト全体で有効 ●ローカル変数:local関数で定義:定義したサブルーチン内と呼び出したサブルーチン内で有効です。 ●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=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";
}