以下のperlで書かれたコードをPHPで書き換えるにはどのようにしたらよいでしょうか


open(FP, "exec ./authcheck at=11000 cp=00120 sc=40001 tu=http://xxxxxxxx/xxtest1/cgi-bin/membertop.cgi
nu=http://xxxxxxxx/xxtest1/entrace.html lt=300 |");
$input=<FP>;
if( (index $input, "Location:") == 0 ) {
close(FP);
print "$input¥n";
exit;
} elsif( (index $input, "uid" ) == 0 ) {
close(FP);
$param = $ENV{'QUERY_STRING'};
@input = split(/&/, $input);
foreach $i (0 .. $#input) {
$input[$i] =~ s/¥+/ /g;
$input[$i] =~ s/%(..)/pack("c", hex($1))/ge;
($key1, $value1) = split(/=/, $input[$i], 2);
$input{$key1} = $value1;
}
$uid = $input{'uid'};
$isp = $input{'isp'};
$asts = $input{'asts'};
print "Content-type: text/html;charset=Shift_JIS¥n¥n";
print "<html>¥n";
print "<head><meta http-equiv=Cache-Control content=no-cache />¥n";
print "<title>会員認証</title></head>¥n";
print "<body bgcolor=ffffff link=ff0000 alink=00ff00 vlink=0000ff>¥n";
print "認証種別:11000<br>¥n";
print "端末: 対応端末 <br>¥n";
print "認証パターン:会員認証<br>¥n";
print "退会時処理:提供不可<br>¥n";
print "課金ログ:なし<br>¥n";
print "告知画面:なし<br>¥n";
print "<a href=http://xxxxxxxx/xxtest1/cgi-bin/member01.cgi?$param>次へ¥n";
print "</body>¥n";
print "</html>¥n";
exit;
}
print


一番参考になる回答をいただけた方に200ポイント差し上げます

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/08/06 07:45:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント200pt

動作未確認のものですが、よろしければ・・・

if (FALSE === $last_line = system("./authcheck at=11000 cp=00120 sc=40001 
        tu=http://xxxxxxxx/xxtest1/cgi-bin/membertop.cgi 
        nu=http://xxxxxxxx/xxtest1/entrace.html lt=300", $input)){
    echo "Error!!  外部プログラムから値が返ってこない。
        または、外部プログラムの呼び出し失敗。<br />\n";
}else{
    if(strpos($input,"Location:") == 0){
        echo "$input\n";
        exit;       
    }elseif(strpos($input,"uid") == 0){
        $param = $_SERVER["QUERY_STRING"];
        $input_array = explode("&", $input);
        $param_array = array();
        $c = count($_array) - 1;
        foreach $i (0 .. $c) {
            list($key,$value) = explode('=',$input_array[$i],2);
            }elseif($key=="uid"){ $uid = urldecode($value);
            }elseif($key=="isp"){ $isp = urldecode($value);
            }elseif($key=="asts"){ $asts = urldecode($value);
            }
        }
        echo "Content-type: text/html;charset=Shift_JIS\n\n";
        echo "<html>\n";
        echo "<head><meta http-equiv=Cache-Control content=no-cache />\n";
        echo "<title>会員認証</title></head>\n";
        echo "<body bgcolor=ffffff link=ff0000 alink=00ff00 vlink=0000ff>\n";
        echo "認証種別:11000<br>\n";
        echo "端末: 対応端末 <br>\n";
        echo "認証パターン:会員認証<br>\n";
        echo "退会時処理:提供不可<br>\n";
        echo "課金ログ:なし<br>\n";
        echo "告知画面:なし<br>\n";
        echo "<a href=http://xxxxxxxx/xxtest1/cgi-bin/member01.cgi?$param>次へ\n";
        echo "</body>\n";
        echo "</html>\n";
        exit;
    }
}
id:jayz

ご回答ありがとうございます

ご指示通り訂正した上で動かしてみましたが

15行目の"foreach $i (0 .. $c) {

"の部分は何をしようとしているのでしょうか

私の中ではforeachは配列をまとめて処理するときに使う程度の認識しかないのですが、何やらこの部分でエラーが起きているみたいです

あっ・・・こういうことですか?↓

foreach ($c as $key => $value) {

これでとりあえず・・・大丈夫かな・・・

すみません・・・もう限界なので寝ま。。。ZZZ

2007/08/02 06:37:53
id:yosuke_ss No.2

回答回数260ベストアンサー獲得回数2

たった200pか。

  • id:KUROX
    PHPってPerlのコードそのまま通ると思ってたけど、
    違うんですね。
  • id:kn1967
    ■KUROX様へ
    PHPってPerlのコードそのまま通ると思ってたけど、違うんですね。

    最近のご活躍頼もしい限りで、楽しく拝見させていただいてますが
    このような文を見ると貴殿のスキルを疑いたくなるのは私だけでは無いはず・・・
    質問者さんの立場を考える事ができて、良い回答もできる方だと思いますので
    もう少し発言にお気をつけになったほうがよろしいかと思います。

    Perlとphp、ステートメントは似通ってますが関数は違うし、
    何より変数の記述が違うという最大の違いがありますので
    今回のように非常にシンプルな構造でも
    時には全面書き直しに近い状態になる場合もあります。
    (今回分はさほど大きな変更はありませんけどね)

    ■jayz様へ
    回答は拒否られている(回答数の多い者はほぼ全滅でしょう)し
    authcheck という別プログラムの挙動が判らないので
    ヒントだけ書いておきますが
    ・変数の書き方が違う
    ・関数の引数が一部違う。
    ・環境変数の取得方法が違う
    といった点を見直せば修正は簡単でしょう。

    質問文は「perlで書かれたスクリプトをphpで書き直す」のかとも読み取れますけど
    素直に、perlで書かれたスクリプトをphpに焼きなおすって意味で良いのですよね?
  • id:jayz
    >>kn1967さん

    ご返答ありがとうございます、なにぶん勉強不足なためいただいたヒントですぐに解決・・・というわけにはいきませんが道標を示していただいてありがとうございます。
    私の質問の意図としては上記のperlのスクリプトと同じことをphpで表現するにはどう記載したらよいのかということです

    あと気になる点がひとつ・・・kn1967さんのおっしゃる「回答が拒否られている」というのは私の質問に対して回答ができなくなっているということでしょうか?もしそうであれば修正したいと思います。(回答できないようにしているつもりはないのですが・・・何か設定が間違ってる?!)
  • id:kn1967
    回答拒否の設定を変えたのですね。
    動作未確認のもので申し訳ありませんがphpで書いてみましたので
    よろしければご確認ください。

    ただ、一部欠き間違えてるかもしれません。
       $param_array = array();
    という行があれば無視してください。
       }elseif($key=="uid"){ $uid = urldecode($value);
       }elseif($key=="isp"){ $isp = urldecode($value);
       }elseif($key=="asts"){ $asts = urldecode($value);
       }

    if($key=="uid"){ $uid = urldecode($value);
       }elseif($key=="isp"){ $isp = urldecode($value);
       }elseif($key=="asts"){ $asts = urldecode($value);
       }
    との間違いです。
    連想配列に格納しようかと思ったのですが3つくらいならこれでいいかって書き直したのが原因でゴミが残りました。

    「動作未確認などいらんわ!!」って事ならば空けずに他の方の回答をお待ちください。

    以上、とりいそぎ訂正まで。。。
  • id:kn1967
    何度もスミマセン。
      $c = count($_array) - 1;
      foreach $i (0 .. $c) {

      $c = count($input_array);
      for($i=0;$i<$c;$i++){
    です。

    あと心配なのは3行目
      lt=300"
    の部分でパイプを外してあること。
    もしかしたら必要だったかも???

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません