P.279
例1:「サブルーチン名のみの実行」

# サブルーチンの宣言(実行するよりも前) sub decimal {$af = sprintf "%.2f", $a} $a = 747 / 199; # 計算する値 decimal; # サブルーチンの実行(名前のみ) print "a = $af"; # 結果の出力
<実行結果> a = 3.75
例2:「変数への引き継ぎ」
# サブルーチンの宣言(実行するよりも前) sub decimal {sprintf "%.2f", $a} $a = 747 / 199; # 計算する値 $af = decimal; # 結果を変数に引き継ぐ print "a = $af"; # 結果の出力
<実行結果> a = 3.75
例:「引数を指定」
$a = 747 / 199; # 計算する値 $af = decimal($a); # 引数 $a を指定 print "a = $af"; # 結果の出力 # サブルーチン(任意の場所) sub decimal {sprintf "%.2f", $a}
<実行結果> a = 3.75
例:「& (アンパサンド) をつけての実行」
$a = 747 / 199; $af = &decimal; # & をつけて呼び出す print "a = $af"; # サブルーチン(任意の場所) sub decimal {sprintf "%.2f", $a}
<実行結果> a = 3.75
例1:「特殊配列 @_ を用いる」
$a = 747 / 199; $af = decimal($a); # 引数 $a を指定 print "a = $af"; # shift @_ で値として引き継ぐ sub decimal {sprintf "%.2f", shift @_}
<実行結果> a = 3.75
例2:「合計と平均」
# 計算するデータ @sugaku = (23, 45, 77, 65, 80, 45, 90); # 合計と平均を計算するサブルーチンの呼び出し(配列で引き渡し) sum_ave(@sugaku); # 小数点の処理をするサブルーチンの呼び出し(変数で引き渡し) $avef = decimal($ave); # 結果の出力 print "合計:$sum \n平均:$avef"; # 合計と平均を計算するサブルーチン sub sum_ave { for (@_) {$sum += $_} # 特殊配列 @_ のまま処理をしていく $ave = $sum/@_; } # 小数点の処理をするサブルーチン sub decimal {sprintf "%.1f", shift @_} # 特殊配列 @_ を値に変換
<実行結果> 合計:425 平均:60.7
例:「大小関係の入れ替え」
# 配列の定義 @a = (15, 40), @b = (60, 35); # サブルーチンの呼び出し @a = change(@a), @b = change(@b); # 結果の出力 print "(@a)\n(@b)"; # 大小関係を入れ替えるサブルーチン sub change { ($x, $y) = @_; return ($y, $x) if $x > $y; # 大 > 小 のときだけ入れ替えて終了 ($x, $y); }
<実行結果> (15 40) (35 60)
例1:「1つの変数を非共有」
# 変数の定義 $a = 10, $b = 20; # サブルーチンの実行 &ab; # 結果の出力 print "a = $a \nb = $b"; # サブルーチン($a を非共有にする) sub ab { my $a; # ここで宣言する $a = 100; $b = 200; }
<実行結果> a = 10 b = 200
例2:「2つの変数を非共有」
# 変数の定義 ($a, $b, $c, $d) = (10, 20, 30, 40); # サブルーチンの実行 &abcd; # 結果の出力 print "a = $a \nb = $b \nc = $c \nd = $d"; # サブルーチン($a, $c を非共有にする) sub abcd { my ($a, $c); # ここで宣言する ($a, $b, $c, $d) = (100, 200, 300, 400); }
<実行結果> a = 10 b = 200 c = 30 d = 400
例3:「配列を非共有」
# 配列の定義 @color = qw (red green blue); # サブルーチンの実行 &rgb; # 結果の出力 print "@color"; # サブルーチン(@color を非共有にする) sub rgb { my @color = @_; # ここで宣言する @color = qw (赤 緑 青); # 日本語に変更 }
<実行結果> red green blue
例1:「内部サブフォルダ class にある seito.pl への指定」
./class./seito.pl /class/seito.pl class/seito.pl
例2:「内部サブフォルダ grade の中のそのまた中の class にある seito.pl への指定」
./grade./class./seito.pl /grade/class/seito.pl grade/class/seito.pl
例:「外部フォルダにある seito.pl への指定」
../seito.pl
例:「外部フォルダにあるサブフォルダ class 内の seito.pl への指定」
../class./seito.pl ../class/seito.pl
例1:「最大値と最小値」 <メインプログラム>
# 配列の定義 @data = (45, 77, 65, 25, 80, 45, 90, 60); # サブルーチンの呼び出し require "mysub/min_max.pl"; # サブルーチンの実行 min_max (@data); # 結果の出力 print "最小:$min / 最大:$max";
<外部サブルーチン>
# min_max.pl sub min_max { my @data = sort @_; $min = shift @data; $max = pop @data; } 1;
<実行結果> 最小:25 / 最大:90
例2:「数値の3桁区切り表示」 <メインプログラム>
# 計算式 $a = 2**(2**5) + 1; # サブルーチンの呼び出し require "mysub/figure.pl"; # サブルーチンの実行 $a = &figure ($a); # 結果の出力 print "a = $a";
<外部サブルーチン>
# figure.pl sub figure { my $a, $a2, $rvs; $a = shift @_; $rvs = join "", reverse split //, $a; $rvs =~s/(...)/\1,/g; $a2 = join "", reverse split //, $rvs; } 1;
↑訂正版
# figure.pl sub figure { my $fig; $_ = shift @_; $_ = join "", reverse split //; s/(...)/\1,/g; s/,\z//; $fig = join "", reverse split //; } 1;

<実行結果> a = 4,294,967,297