PHP Perl 2021年08月18日 19:52   編集
PerlからPHPへ書き換えからの続きです。

qq()を""へ置換して内部の"をエスケープするのがエディタの正規表現置換ではうまくいかないということで、PHPを使ってその書き換えをすることにしましたが、どうせならついでにほかの置換部分、ダブった変数の書き換えもやれるようにしたのが、perl2php.phpです。
ver.1.0	2014/11/28	機能制限モード追加
ver.1.1 2021/08/18 PHP8でうまく動かないのを修正
久しぶりに更新しました。PHPの仕様変更への対策だけですが。Xampp8.0.3参照
webに置いて使用するようなものではないので、ローカルでのみ実行可能ですが、機能制限版をアップしました。
xamppなどを入れてローカルでPHPを動かせる環境を持ち、自分でperlやPHPを書いている人対象ということになります。使用する場合はあくまでも自己責任でお願いします。
使用法は簡単で、実行するとperl2php.phpを置いたディレクトリ内のcgiファイルが一覧表示されます。
ほかのディレクトリにあるファイルを書き換える場合は、「△上のディレクトリへ」などを使って目的のファイルのあるディレクトリへ移動します。ディレクトリ内の一覧は
△上のディレクトリへ
■ファイル
□ディレクトリ
のように表示されます。
目的のファイル名をクリックすると、ファイルの内容が分析され、以下のような情報が表示されます。
  • 文字コード
    perl2php.php自身の文字コードはSJISですが、EUC-JPやUTF-8で書かれたファイルの書き換えにも対応しています。自動的に判定しますが、間違っていた場合は手動で変更もできます。
  • スカラーや配列で重複して使用されている変数名の一覧
  • 変換する書式の候補一覧
  • 選択したファイルの内容。
    perl2php.phpではSJISで表示するので、ファイルの内容はSJISに変換した上で表示されます。
    これが文字化けしていたら手動で文字コードを変更してやる必要があります。

変数の変換

一応置換の順番があります。まず重複した変数の変換を行うべきです。
書式の変換でperlの配列やハッシュをPHPの書式に変更しますが、先に@から$への変換などをやってしまうと、重複して@dataや%dataなどが使用されていた場合、そのままPHPの書式$dataに変換してしまったら、どれが配列だったか、ハッシュだったか、わからなくなってしまうからです。

「(変数名)を編集」リンクを押すと、新しい変数名を入力するフォーム、ファイル内で該当変数が使用されている行が表示されます。スカラー変数は、配列は、ハッシュは色で表示されます。
新しい変数名をフォームに入れて、「変数名を編集する」ボタンを押すと、該当する変数がすべて変更されます。
同時に変更された内容は一時ファイルに保存され、以降の編集はこの一時ファイルをもとに行われます。

一括で変換することもできます。「一括で変換する」をクリックすると、配列は末尾に「_list」、ハッシュは末尾に「_hash」をつけた名前に変更されます。

書式の変換

変数の重複がないように編集し終えたら、書式の変換を行います。
変換の説明の右に表示される**件というのは該当箇所の数で、そのリンクを押すと、該当する変換の行数と、現在のコードと変換後のコードが表示されます。変換部分は色を変えて表示されます。
OKだったら「以下の変換を実行」をクリックすると変換が実行され、変更内容は一時ファイルに書き込まれます。
これも「すべて変換する」を押すと、表示されている書式変換リストすべてを一気に変換します。

正規表現パターンを直接フォームに書き込み、それによって変換することもできます。
たとえば、フォームからの送信内容を$in{'get'}のようなハッシュに保存している場合、「パターン」に
\$in\{([^\}]+)\}
「置換」に
$_REQUEST[$1]
と書いて変換すると、スクリプト中の$in{'mode'}や$in{$_}のような部分がすべて$_REQUEST['mode']や$_REQUEST[$_]に書き換えられてプレビューされ、「変換を実行」ボタンで変換されます。

注意

perl2php.phpはあくまでも、perlからPHPへの書き換え補助で、これで変換したからといって、すぐにPHPとして動くということはまず、いや絶対にありません。
また、個人用に書いたものなので、汎用性はどうなのかよくわかりません。
perlの書き方も人によってくせがあると思うし、書式変換の正規表現パターンも、自分がよく書く文章のパターンにマッチしやすいものになっているので、別の人が書いたperlコードでは、プログラム的には正しいのに、うまく変換できないという場合もあるかもしれません。
そういう場合は正規表現のパターンをカスタマイズすることをお勧めします。
書式変換の正規表現パターンはfunction formula()の最初に書いてあるので、これを編集することによってより効率的に、正確に変換することが可能だと思います。

このスクリプトが使い物になるかどうかは、使用する正規表現置換パターンの完成度次第だと思いますが、今のところかなりいい加減です。レアケースも変換しようとして、妙な具合に変換してしまうよりは、無視する方がいいのでしょうが、今のところ、妙な具合に変換されてしまうところもあります。

正規表現がらみでは、PHPでは正規表現パターンを使用できるpreg_matchやpreg_replaceがありますが、正規表現が必要でない場合、より高速に実行できるstrstrやstrpos、str_replaceといった関数もあります。
perlのコードが
$str =~ /^\d{1,5}$/
だった場合、デリミタの/(スラッシュ)で囲まれた部分が正規表現パターンでない場合、strstrに変換し、正規表現パターンの場合はpreg_matchに変換するというのが理想なのですが、「正規表現パターンにマッチする正規表現パターン」というのが今のところわからないので、現状ではpreg_matchにしか変換していません。
正規表現パターンを使ったマッチ処理の方が少ないという場合は、strstrに変換するよう置換パターンを編集した方がいいかもしれません。

perl2phpで編集しただけでは当然動かないので、編集後テストしながらさらにエラーを修正することになりますが、
その修正で「なんか似たようなパターンで修正しているな」という部分があったら、その修正をまとめて実行する正規表現パターンを追加するという方針でチューニングするのがいいと思います。

おまけ

perlからPHP移行への補助として、eval_tmp.phpもおまけとしてアップします。
これは入力したPHPコードをeval関数でPHPとして実行するというもので、PHPコードの挙動を手軽にブラウザ上で確認できます。

入力したコードをなんでもevalしてしまうので、perl2php.phpよりもあぶないスクリプトです。
当然ローカル環境のみの使用ということでおねがいします。
ちなみに、eval_tmp.phpという名前からもわかるように、
eval.cgiというperlスクリプトをperl2php.phpで変換したものです。
counter:8,328