Perlスクリプト内で1つの関数を呼び出す
subによる制御構造を使ってPerl内でサブルーチンを作成すれば、他のPerl組み込み関数(print、join、sortなど)と同じように、何度でもこれらのサブルーチンを呼び出すことができます。subコマンドの一般的な構文を以下に示します。
sub mysub {
instruction1;
instruction2;
...
instruction3;
}
次に示すサンプルアプリケーションは、再帰関数を用いて1から65までの整数の合計を計算します。このPerlスクリプト(function.pl)には、再帰関数sumが含まれています。
#Argument from the PHP script
#in this case the argument=65
#and is used to call the recursive function sum
$a=$ARGV[0];
#Calling the recursive function sum
$var = sum($a);
#Listing the result after the sum function was executed
print "Sum of 1+2+3+...+$a numbers is = $var\n";
# Define the recursive function
sub sum
{
my $num = $_[0];
# Declaring local variable
if ( $num == 0 )
{
$var = 0;
return ;
}
else{
# The recursive expression
$var = $num + sum($num-1);
}
}
Perlのsum関数を呼び出すPHPスクリプト(function.php)を以下に示します。
<?php $result=shell_exec( "C:\Perl\bin\perl.exe function.pl 65"); echo($result); ?>
出力結果は次のようになります。
Sum of 1+2+3+...+65 numbers is = 2145
このPHPスクリプトはPerlスクリプトを呼び出しているのであり、Perl関数そのものを呼び出しているのではありません。この再帰関数はPerlスクリプト内で呼び出されます。
マルチ関数スクリプト内の個々の関数を呼び出す
Perlスクリプト内に複数の関数が存在する場合には、目的の関数を呼び出すのにちょっとしたテクニックが必要となります。
例えば、2つの関数が含まれるPerlスクリプト(functionsCall.pl)があるとします。リスト1に示すように、最初の関数は与えられた数の階乗を計算し、2番目の関数は上の例で使用した再帰sum関数です。
$a = $ARGV[0];
$b = $ARGV[1];
#Check what function was called from PHP and calls that function
if ( "$a" eq "fact" )
{
print "The function -- $a -- was called from PHP and the "."<br />";
#The call of fact function using $b as argument
$var1 = fact($b);
print "$a($b) is : $var1 ";
# Define the recursive fact function
sub fact () {
my $val = $_[0];
if ($val > 1) {
$fv = $val * fact($val-1);
} else {
$fv = 1;
}
}
}
if ("$a" eq "sum")
{
print "The function -- $a -- was called from PHP and the "."<br />";
#The call of sum function using $b as argument
$var2 = sum($b);
print "sum of the first $b numbers is $var2 \n";
# Define the recursive sum function
sub sum ()
{
my $num = $_[0];
# Declaring local variable
if ( $num == 0 )
{
$var = 0;
return ;
}
else
{
# The recursive call of the sum function
$var = $num + sum($num-1);
}
}
}
さて、このリスト1のスクリプトから関数を1つだけ呼び出したいとします。そのためには、関数名を選択して実行し、引数を渡すPerlスクリプトを記述する必要があります。次のPHPサンプル(functionsCall.php)は、リスト1のfact関数を呼び出し、引数12を渡します。
<?php $result=shell_exec( "C:\Perl\bin\perl.exe functionsCall.pl fact 12"); echo($result); ?>
出力結果は次のようになります。
The function -- fact -- was called from PHP and the fact(12) is : 479001600
fact関数ではなく、sum関数を呼び出して引数39を渡すには、PHPスクリプトの呼び出し行を次のように置き換えるだけでいいのです。
$result=shell_exec( "C:\Perl\bin\perl.exe functionsCall.pl sum 39");
この場合の出力結果は次のようになります。
The function -- sum -- was called from PHP and the sum of the first 39 numbers is 780
