SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Windows環境でのPerlとPHPの連携

PHPを使ったPerlスクリプトの実行、パラメータの受け渡しなど

Perlスクリプト内で1つの関数を呼び出す

 subによる制御構造を使ってPerl内でサブルーチンを作成すれば、他のPerl組み込み関数(printjoinsortなど)と同じように、何度でもこれらのサブルーチンを呼び出すことができます。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関数です。

リスト1 複数の関数を含むPerlスクリプト
$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

次のページ
PHPとPerl間での配列の受け渡し

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Octavia Andreea Anghel(Octavia Andreea Anghel)

経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4169 2009/08/03 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー