12万作品が月額500円(税別)で見放題なのはdTVだけ!! >>dTV(外部リンク)

perlのプログラムから同一サーバー内のphpを実行してその結果を取得したいのですが、うまくいきません。

print.phpというファイルの中身が
<?
echo "<div>1234567890</div>";
?>
だとして、これをブラウザで見た場合のソースは
<div>1234567890</div>
となるわけで、この1234567890をperlのプログラム内で表示するために

main.cgiというプログラム内で
$data = '/***/www/print.php';
open(FH,$data);
@list = <FH>;
foreach $data_line ( @list ) {
if ($data_line =~/<div>/ ){
$data_line =~ s/<div>//i;
$data_line =~ s/<\/div>//i;
print = $data_line;
}
}
close(FH);
のような処理をすると
echo "1234567890";
という実行前のphpの中身が表示されてしまいます。

表示したい結果はこの場合ブラウザでphpを実行した時のソースからdivタグをperl側で抜き取った
1234567890
なのですが、同じ事をperlの書き換えで実現する上手い方法があればご教授いただけますと助かります。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>$data = '/***/​www/print.php';​


>open(FH,$data);

これだと、PHPの実行結果ではなくて、もろ、print.phpを開いています。
なので、www/print.phpをPHPで実行した処理結果で、置換処理等を行わないといけないです。

○PHPをコマンドラインから実行
http://phpspot.net/php/man/php/features.commandl …
http://www.spencernetwork.org/memo/tips-6.php

○Perlのファイル操作http://www.ipc.hokusei.ac.jp/~z00104/perl/fileha …

あたりを参考にして、
$PHP = '!/usr/bin/php'; #PHPのパス
$PHP_FILE='/***/​www/print.php';​#実行するPHP
open FH, "$PHP -q $PHP_FILE|";
@list = <FH>;
close FH;

ってな具合でいけるのではないかと、思います。
PHPはないので、未確認ですが。

あと検索は、「php コマンドライン」や「perl パイプ」あたりでしてみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

四苦八苦し解決まで時間を要しましたが、教えていただいた資料が大変参考になりました。
大変ありがとうございました!!

お礼日時:2006/11/18 22:26

NO3、ちょっと間違いがあります。


$PHP = '!/usr/bin/php'; #PHPのパス
びっくりマークはいらないですね。
$PHP = '/usr/bin/php'; #PHPのパス
    • good
    • 0

>perlに「php」という命令があるということですか?


・・・・・
こういう形と同じ事を言ってるんだけど・・・
 system "ls -1"

サーバ側にcli版phpが無いとできない
 system "php print.php"
    • good
    • 0

php print.php


みたいな形で呼んで結果を取り込んだらだめなのかな?パイプとか。
systemだかexecだかで呼ぶんじゃなかったっけ?

この回答への補足

>php print.php
>みたいな形で呼んで結果を取り込んだらだめなのかな?パイプとか。

perlに「php」という命令があるということですか?
検索したのですが、ちょっとうまくひっかけることができなかったので
もう少しつっこんだ感じでお伺いできますでしょうか。
要するにperlで結果を取り込んでその後divを置換で消すとか、単純な処理を考えています。
phpはあくまでサブルーチン的に別処理の結果を吐き出すためだけに使用しています。

>systemだかexecだかで呼ぶんじゃなかったっけ?

これを使うとどういう形で返ってくるのか、自分の知識ではいまいち心元ないです。実行させるのはいいとして、結果の受け取りにまた手続きがいるというか、何か変数を用意すればそれに入ってくれるのかなど、です。
元のプログラムにもあるように1行ずつ変数に入れて、必要な部分だけ抜き取って加工してprintで表示させたい思惑です。

補足日時:2006/11/07 00:37
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHPからPerlにデータを渡して結果を受け取りたい

今、PHPでプログラムを作っています。
そのプログラムからPerlで作られたプログラムにデータを渡して結果を受け取りたいと思います。

PHPからPerlのプログラムを呼び出してデータの受け渡しをすることは出来ますでしょうか。
出来るとすればどうすれば良いでしょうか。
よろしくお願いいたします。

Aベストアンサー

http://jp.php.net/manual/ja/language.operators.execution.php
http://ml.php.gr.jp/pipermail/php-users/2002-November/011279.html

こんなのでどうでしょう。但し、記されている注意の通りです。

Qperl内でPHPを動かす?

perlでhtmlを書き出しています。
そのhtmlにPHPを埋め込みたく思い、書き出されたhtmlにPHPを記述して
phpとして保存。動作を確認しました。

perlで書き出している全てのページにこのPHPを埋め込みたく思い、perlの
print <<EOF; ~ EOF の間に <?php ~ ?> を埋め込みましたが動きません。
当然の結果なのでしょうか… 何か方法があればご教示願います。 

下記のようなページも見つけましたが、コードをperlに貼り付けても
動作しません。直接貼り付けるのではないのでしょうか?
http://phpspot.org/blog/archives/2006/03/perlphp_2.html

どうぞ宜しくお願いします。

Aベストアンサー

> この場合、$member1 = "ddd"; の部分を $member1 = "$xxx"; としている箇所は
> 当然$xxxのまま表示されていますが、これはもう手動か別のアプリで書き換えるしかないですよね?
> 実はこの"aaa""bbb"…"ddd"の部分が全部変数なんです。

方法2で、PHPの変数を示す$は\$に、Perlの変数を示す$はそのまま、
という書き換えをすればいけます。

---ここから---
print <<EOF;

<?php

\$nam = fopen("​http://www.aaa.co.jp/bbb/ccc.html","r");

while(!feof(\$nam)){
\$line = fgets(\$nam,1024);
\$li_array[] = \$line;
}

\$li_nam = implode("", \$li_array);

\$member1 = "$xxx";
\$member2 = "$yyy";
\$member3 = "$zzz";
---以下略
といった感じにすれば、$xxxの所は、HTMLファイルに出力した段階で、Perlの変数$xxxの内容で置き換えられます。

> この場合、$member1 = "ddd"; の部分を $member1 = "$xxx"; としている箇所は
> 当然$xxxのまま表示されていますが、これはもう手動か別のアプリで書き換えるしかないですよね?
> 実はこの"aaa""bbb"…"ddd"の部分が全部変数なんです。

方法2で、PHPの変数を示す$は\$に、Perlの変数を示す$はそのまま、
という書き換えをすればいけます。

---ここから---
print <<EOF;

<?php

\$nam = fopen("​http://www.aaa.co.jp/bbb/ccc.html","r");

while(!feof(\$nam)){
\$line = fgets(\$nam,1024);
...続きを読む

Qphpの中で外部のcgiを実行させる方法

aaa.phpの場合、外部のphpファイルをincludeで呼び込めますが、ではaaa.phpでcgiを呼んで来て実行させることはできるのでしょうか?

Aベストアンサー

echo file_get_contents('hoge.cgi');

みたいにすれば呼び出る、というようなじょうほうを見つけました。
すいませんPHPできないので、本当にできるかは分かりません。

リファレンス見ましょう。
http://jp2.php.net/manual/ja/funcref.php

QPHPで別PHPを呼び出す。

PHPプログラムないで別PHPを呼び出し戻り値を受け取ろうと考えています。


test1.php-------------
<?php
print "<html><body>\n";
$return_data= exec(/usr/local/bin/php ./test2.php?param1=1¶m2=2);
print $param1."+".$param2."=".$return_data;
print "</body></html>";

test2.php------------------
<?php
$return_item = $param1 + $param2;
print $return_item;
?>

のように、test1.phpからパラメータを渡し、
test2.phpで計算をして答えをtest1.phpに返す
プログラムを作成しました。

test1.phpからtest2.phpをパラメータをつけて渡すのが
うまくいきません。

execではパラメータをつけることはできないのでしょうか?もしくは他の方法はないでしょうか?

functionやincludeではなく上記の方法で行いたいと思っております。

お手数ですが、アドバイスお願い致します。

PHPプログラムないで別PHPを呼び出し戻り値を受け取ろうと考えています。


test1.php-------------
<?php
print "<html><body>\n";
$return_data= exec(/usr/local/bin/php ./test2.php?param1=1¶m2=2);
print $param1."+".$param2."=".$return_data;
print "</body></html>";

test2.php------------------
<?php
$return_item = $param1 + $param2;
print $return_item;
?>

のように、test1.phpからパラメータを渡し、
test2.phpで計算をして答えをtest1.phpに返す
プログラムを作成しまし...続きを読む

Aベストアンサー

こんにちは。

CやJAVAやっていれば、すぐわかるのでしょうが・・・。
コマンドライン上からパラメータを渡す方法を考えてください。

PHPのようなC言語ライクな言語では慣用的に、

argv や argc といった「arg」が付く変数名が特別な扱い方をされます。
JAVAだと args ですね。
で、PHPだと、
$argv と $argc になります。

$argv は、引数で渡されたパラメータの配列です。
$argc は、パラメータの個数が格納されています。

パラメータの渡し方は、

"/usr/local/bin/php ./test2.php aaa bbb"

のように、半角で区切った形になります。

GETのように、スクリプトのあとに aaa=bbb&ccc=ddd と渡すと
「&」以降が特殊な値ととられてしまいます。

具体的にいうと、 test2.php のパラメータを受け取る部分は以下のようになります。

$param1 = $argv[1];
$param2 = $argv[2];

で、$argv[0] には、./test2.php が入っています。(実行させたいスクリプトへのパス)
また、$argc には、3 が入っています。(配列$argv の要素数)

次に、実行結果を受けとる方法ですが、

test2.phpから、実行結果を受け取りたい場合は、exec 関数は、他の言語の exec 関数より便利に出来ています。

test1.php を以下のようにしてください。

exec("/usr/local/bin/php ./test2.php aaa bbb" , $rec , $status);
if ($status != 0){
print "失敗しました";
exit(1);
}

test2.php は、

print $return_item;
exit();
?>

とした場合、
$rec に print で出力した結果が入っていると思います。

※注意

実をいうと $rec には意図した結果以外に色々なデータも入っています。
たとえば、test2.php で、

$aaa = "aaaa";

print $aaa;

とした場合、
$rec には、

$rec[0] : Content-type: text/html; charset=EUC-JP
$rec[1] : X-Powered-By: PHP/5.0.2
$rec[2] :
$rec[3] : aaaa

という値が入っています。
$rec[0] から $rec[2] までは環境によって違います。つまり、test2.php から受け取ったデータが $rec のどの要素に入っているかは、環境によって違ってきますので、まず、


exec("/usr/local/bin/php ./test2.php aaa bbb" , $rec , $status);
if ($status != 0){
print "失敗しました";
exit(1);
}
print_r($rec);


で、確認してみてください。

こんにちは。

CやJAVAやっていれば、すぐわかるのでしょうが・・・。
コマンドライン上からパラメータを渡す方法を考えてください。

PHPのようなC言語ライクな言語では慣用的に、

argv や argc といった「arg」が付く変数名が特別な扱い方をされます。
JAVAだと args ですね。
で、PHPだと、
$argv と $argc になります。

$argv は、引数で渡されたパラメータの配列です。
$argc は、パラメータの個数が格納されています。

パラメータの渡し方は、

"/usr/local/bin/php ./test2.php aaa bb...続きを読む

QCGI内でphpを含むhtmlを読込みたい

はじめまして。makademiと申します。
phpはまったくの初心者ですので、的外れでしたらすみません。

現在、以下のような構成のアンケートフォームを作成しています。

form.cgi
↓読み込み
input.html 入力画面
check.html 確認画面
error.html エラー画面
end.html  完了画面

全てのhtmlはcgiでコードを読込んだ後に、print文で書き出しております。

今回はこのhtml内にphpのコードを書き込み、phpを動作させたいのですが、この場合どのようにすればよろしいでしょうか。

phpの動作の前提が『ファイル名.php』であるかと考えてますので、これだと拡張子は.cgiになってしまいます。

何か手はないでしょうか。

Aベストアンサー

CGIとPHPはそもそもの動作する仕組みが違うため、そのままではできません。
一応、CGIの拡張子をPHPとして実行することは可能ですが、その場合はCGIとしては機能しません。

PHPは仕組みが違うと書きましたが、PHPにはCGIモードやコンソールモードといったものもあります。
たとえば、CGIモードの場合、perlのようにCGIの拡張子にして、ファイルの先頭部分に#!/usr/local/bin/phpのようにphpのコマンドラインのパスを入れてあげればCGIとして動作するはずです。

また、Perlやそのほかの言語で作成したCGIに.phpファイルのようなものを読み込みたい場合、少し手間ですが、コマンドラインのphpに.phpファイルを引数にして渡してあげれば、phpとして動作した結果のHTMLを受け取ることができるはずです。

はずばっかりですが、実際には、そういう動作は用意されているのは知っていますが、どう考えても普通にphpやperlを実行した方が早いので私はやったことはありません。

そもそも、そんなに言語をまぜこぜにする利点はあまりありませんので・・・苦労の方が多いですよ。

CGIとPHPはそもそもの動作する仕組みが違うため、そのままではできません。
一応、CGIの拡張子をPHPとして実行することは可能ですが、その場合はCGIとしては機能しません。

PHPは仕組みが違うと書きましたが、PHPにはCGIモードやコンソールモードといったものもあります。
たとえば、CGIモードの場合、perlのようにCGIの拡張子にして、ファイルの先頭部分に#!/usr/local/bin/phpのようにphpのコマンドラインのパスを入れてあげればCGIとして動作するはずです。

また、Perlやそのほかの言語で作成したCGIに...続きを読む

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QCGIから外部コマンド実行時の標準出力の取得方法について

RH7.3の環境で試しているのですが、どうもうまく動作しません。

CGIから呼び出す方法として3つ試したのですが、
open(IN,"|sudo -u USER PROGRAM");
$text = `sudo -u USER PROGRAM`;
system("sudo -u USER PROGRAM");
最後のsytemは一応期待通りの動作になりました。
ただ、これですと実行結果(標準出力)を取り込めないのですが、何か方法はありませんか?
PROGRAMはbashのシェルスクリプトです。

最初の2つですと、sudoの関係かエラーが出ます。
./PROGRAM: SQL*Plus:: command not found
systemの場合はちゃんと動作します。

■実際にやりたいこと
oracleサーバへの問い合わせ結果を取得したいのですが、
10gのクライアントまでは入りましたが、perlのDBD::Oracleがうまく入らなかったため、sqlplusで処理しようと考えています。
最初は直接CGIから呼び出そうとしたのですが、sudo時に環境変数が設定されないので、bashのシェルスクリプトにexportで先頭に書いております。
外部公開サーバではありませんので、とりあえずセキュリティーは無視しています。

systemで実行結果をcgiの標準入力に渡すか、バッククォートでエラーが出なくするかどちらかの方法はありませんでしょうか?

RH7.3の環境で試しているのですが、どうもうまく動作しません。

CGIから呼び出す方法として3つ試したのですが、
open(IN,"|sudo -u USER PROGRAM");
$text = `sudo -u USER PROGRAM`;
system("sudo -u USER PROGRAM");
最後のsytemは一応期待通りの動作になりました。
ただ、これですと実行結果(標準出力)を取り込めないのですが、何か方法はありませんか?
PROGRAMはbashのシェルスクリプトです。

最初の2つですと、sudoの関係かエラーが出ます。
./PROGRAM: SQL*Plus:: command not found
sys...続きを読む

Aベストアンサー

open(IN,"|sudo -u USER PROGRAM");
は、前にパイプがあるので標準入力を受け付けています。

標準出力を取得するには、
open(IN,"sudo -u USER PROGRAM|");
後ろにパイプをつけてください。
そして、 print while(<IN>);

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

QCGIでソースがそのままでてしまうのですが・・・。

CGIでソースがそのまま表示されてしまうのですが、どうしてなのでしょうか?

先週からCGIやPerlを学び始めました。そこで簡単なものを試しに作ってみたのですが、入力したソースがそのまま表記されてしまいます。

ちなみに、こんなものです。

#! c:/perl64/bin/perl

print "Content-type: text/plain\n\n";
print "Hello Perl !";

どこをどう変えればいいのか、わからないので、質問してみました。

わかる方がいましたら、教えてください。

初心者なので、お手柔らかにお願いします。

.





この質問に補足する.

Aベストアンサー

CGIスクリプトのソースがそのまま出力されるのは、そのファイル/URIがCGIとして実行できていないためです。

httpd.confの<Directory>ディレクティブや<Location>ディレクティブなどの指定箇所が間違えているか、
ファイルの拡張子を間違えているか、
httpd.confを書き換えてからApacheをリスタートしていないか。。。


Forbiddenが出てきたら.cgiファイルに実行権限が無い。
Internal Server Errorが出てきたら、Perlがインストールされていないか.cgi拡張子とPerlが関連づけられていない。

ということが考えられます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング