くだすれPerl(超初心者用)2
- 1 :nobodyさん:2008/03/03(月) 05:07:32 ID:???
- このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
- 334 :nobodyさん:2008/07/01(火) 23:37:34 ID:???
- >>333
config で make program を変更してみるとか、、、フォースインストール
するとか、、、
俺の場合はMath::BaseCalcじゃないけど、makeでコケた奴はソースで手動で
コンパイルして入れたりもする。
- 335 :nobodyさん:2008/07/01(火) 23:40:04 ID:???
- >>333
まずはインストール時のメッセージをじっくり調べてみてはいかがでしょう。
- 336 :うっとりハムちゃん:2008/07/05(土) 00:33:32 ID:NR2upuAB
- すいません、おじゃまします。
cgiにアクセスした際に、同時に○○.phpを読み込む際のPerl記述を教えていただけると助かります。
よろしくおねがいします。
- 337 :nobodyさん:2008/07/05(土) 09:04:26 ID:???
- つ system
つ ``
- 338 :うっとりハムちゃん:2008/07/05(土) 13:03:49 ID:NR2upuAB
- レスありがとうございます!
例えば○○.php を読み込みたい(実行したい)場合、以下では無反応なのですが、間違っていますか?
system ("○○.php");
- 339 :うっとりハムちゃん:2008/07/05(土) 13:38:38 ID:NR2upuAB
- 説明不足で申し訳ないのですが、用途としては、
phpカウンターをcgi(掲示板)実行時にも
カウントさせたいのです。
IMGタグでphpを読み込んでもいいのですが、
これだと携帯で見た時に壊れた画像マークになっちゃうので。。。
それで、cgiを実行時にphpファイルも同時実行できないかと思い、困っています。
よろしくお願いします。
- 340 :nobodyさん:2008/07/05(土) 14:13:13 ID:???
- 携帯でそうなる理由を調べてそれを解消したほうが早い
systemで実行するなら/usr/local/bin/php xxx.phpとかだろうけど
それでキミの欲しいものが得られるのか?
http経由で呼ぶならそうすればいい
- 341 :うっとりハムちゃん:2008/07/05(土) 15:00:49 ID:???
- できました!
とても助かりました!!
どうもありがとうございました。 m(_ _)m
- 342 :nobodyさん:2008/07/05(土) 20:33:29 ID:???
- >>341
おめでとう。
何をどう変えてどのような望む動作が得られたのかはさっぱりわからんが。
- 343 :nobodyさん:2008/07/05(土) 21:27:12 ID:???
- おそらく直に読んでカウンターが上がったんじゃないかと
- 344 :うっとりハムちゃん:2008/07/05(土) 23:02:34 ID:NR2upuAB
- たびたびすいません (><)
system ("/usr/local/bin/php ○○.php");
↑これで うまくできたのですが、他のレンタルサーバーでも使おうと思ってみたら、
そっちではphpを読み込んでくれず、ソースコードが丸ごと表示されちゃいました。
サーバーによって動作は異なるのでしょうか?
- 345 :うっとりハムちゃん:2008/07/06(日) 01:29:25 ID:+aL1pH4z
- もしかして system の場合、何か終了(閉じる?)を記載しないといけないのでしょうか?
単純にphpカウンターを実行するだけでいいのですが。。。
- 346 :nobodyさん:2008/07/06(日) 02:26:42 ID:???
- >>344
そりゃあんた、その違うレンサバとやらがphp対応なのかどうかと、
phpの実行パスが/usr/local/bin/phpとは限らんだろう。
サーバによっては、httpからはphp実行出来ても、ユーザー権限で直接実行出来ないように
設定されてる場合もあるし。
- 347 :うっとりハムちゃん:2008/07/06(日) 02:40:09 ID:+aL1pH4z
- ありがとうございます。
サーバー会社に問い合わせたところ、
system ("/usr/local/bin/php ○○.php");
で動作しますと言われました。
パスに関してはあっているようです。
- 348 :nobodyさん:2008/07/06(日) 10:59:36 ID:???
- こんにちは初心者です。
KENTWEBさんのところのBASIC認証式パスワード管理pwmgrというCGIを使いたいと思っています。
サーバーはろりぽっぷなのですが
CGIプログラムの説明を読んでいると、ログの取得について、
# 【利用条件】
# 1. SSIの利用できるサーバ
# 2. 環境変数 $ENV{'REMOTE_USER'} にてユーザーIDが取得できること
# ※ 2. については、同梱の pwlog_test.cgi にてテストすること
とあるのですが、
環境変数 $ENV{'REMOTE_USER'} とは何なんでしょうか?
使えない場合、使えるようにする方法はあるんでしょうか?
教えて下さい。
よろしくお願いします。
また、他の方法でIDとホスト名をリスト化することはできないでしょうか?
- 349 :nobodyさん:2008/07/06(日) 13:52:43 ID:???
- KENTWEBさんに聞くとか^^
- 350 :nobodyさん:2008/07/06(日) 15:54:22 ID:???
- >>348
固有の ID であれば良い、ということであれば、何かユニークな文字列を生成して $ENV{'REMOTE_USER'} に代入しておく手もあります。
あんまり筋の良くない手法なので元のスクリプトの動作を理解した上でどうぞ。
詳細は perlvar の %ENV ハッシュの項を見てください。
- 351 :うっとりハムちゃん:2008/07/06(日) 16:27:06 ID:+aL1pH4z
- たびたびすいません。
system ("/usr/local/bin/php ○○.php");
で正常に動作するのはCLI版のPHPで、
CGI版のPHPだとヘッダが出力されるため
表示がおかしくなり、動作しないみたいです。
解決するためにはCGI版のPHPでヘッダが出力されないように
systemを行いたいのですが、その場合の記述は
どのようになるのでしょうか?
- 352 :nobodyさん:2008/07/06(日) 17:26:48 ID:???
- >>351
# 勘でレス
my $php_output = qx{"/usr/loca/bin/php ○○.php"};
print +(split(/\n\n/, $php_output, 2))[1];
- 353 :うっとりハムちゃん:2008/07/06(日) 17:41:18 ID:+aL1pH4z
- レスありがとうございます。
my $php_output = qx{"/usr/local/bin/php ○○.php"};
print +(split(/\n\n/, $php_output, 2))[1];
を使わせていただきましたが、phpが実行されませんでした。。
- 354 :352:2008/07/06(日) 18:08:25 ID:???
- >>353
system( qw{/usr/local/bin/php -q ○○.php} ); # これも勘
- 355 :うっとりハムちゃん:2008/07/06(日) 18:17:32 ID:+aL1pH4z
- レスありがとうございます。
phpを実行しようとしているようですが、そのために
ヘッダが出力されるため表示がおかしくなり、動作しないみたいです。
- 356 :352:2008/07/06(日) 18:29:36 ID:???
- # さらに勘で
# Perl スクリプトをその場で即座に終了してよければ
exec( qw{/usr/local/bin/php -q ○○.php} );
ちなみになぜ勘なのかというと、情報がタリンからです。
ぱっと思いついた不足情報を以下に列挙しておきます。
・最終的に端末に返されるデータはどういうものか
・それは perl から返すのか php から返すのか
・Perl スクリプトで system() を呼び出す前後にどのような処理を行い、
・また、どのような出力をどこに返しているか
「phpが実行されませんでした」
・PHP処理系が起動しないのか、
・期待した表示が行われないだけなのか
「表示がおかしくなり」
「動作しないみたいです」
・おかしいとは具体的にどういうことか
・おかしいながらも表示はされているのに動作しないとはどういうことか
- 357 :うっとりハムちゃん:2008/07/06(日) 19:15:01 ID:+aL1pH4z
- 度々すいません。
掲示板CGIにアクセスがあった際に
phpカウンターを同時に実行(カウント)させたいのです。
とくに戻ってくる必要はなく、基本的には教えていただいた
system ("/usr/local/bin/php ○○.php");
で良さそうなのですが、問題は
CGI版のPHPでヘッダが出力されないように
systemを行うことなので、悩んでいます。
system ("/usr/local/bin/php ○○.php");
の場合、phpのヘッダが戻ってくることにより
CGIがおかしくなり、ソースコードがまるまる表示されてしまいます。
単純に、返ってくるヘッダを無効(?)にする記述があると助かります。
説明が下手ですいません。。
- 358 :352:2008/07/06(日) 21:03:06 ID:???
- >>357
> 単純に、返ってくるヘッダを無効(?)にする記述があると助かります。
実際に HTTP Response Header 出力が原因だとすれば、やはり、
system( qw{/usr/local/bin/php -q ○○.php} ); # -q に注目
でうまいこといきませんか。
> CGIがおかしくなり、ソースコードがまるまる表示されてしまいます。
「CGIがおかしくなり」には具体的情報がありません。
「ソースコード」は何のソースコードでしょう?
どうしてもうまくいかないときは、あっさり発想を切り換えて別の設計を試すのも一興。
がんばってください。
- 359 :nobodyさん:2008/07/07(月) 01:56:34 ID:???
- >>357
phpから帰って来た値(文字列)を出力する必要あるのか?
それまでの説明から、
> 掲示板CGIにアクセスがあった際に
> phpカウンターを同時に実行(カウント)させたいのです。
ってことだから、多分外部ファイルなりにカウントを保存してるんだと思うけど、
その数値がインクリメントされさえすればいいってのなら、
my $php_res = `/usr/local/bin/php *.php`; とでもして、
その受け取った戻り値の$php_resは出力させなければいい。
system()にしろ、print $php_res; にしろ受け取った戻り値をそのまま出力させようとするから、ヘッダとかでおかしくなる。
どうしても戻り値をperl側から出力したいのであれば、>>352で出来そうな気もするけど、
ひょっとしたら改行が"\r\n"かも知れないので、
for (split/\n/,$php_res){
print "$_\n" unless(m/^Content\-type:/i);
}
でどうか?(生の戻り値に"Content-type"から始まる文字列行がないことが前提だけど・・)
> ソースコードがまるまる表示されてしまいます。
これだけど、自分のごく勝手な勘だけど、上記の件とは無関係に、<? ?>が原因でね?
ちゃんと<?php ?>にしてるか〜?
- 360 :うっとりハムちゃん:2008/07/07(月) 02:22:31 ID:w0zyvflA
- 皆さん、レスありがとうございます。
>358
-q でヘッダを出力しないようにできると思ったのですが、ダメでした。
同様にCGIのプログラムが まるまる表示されてしまいます。
phpを実行しているのは間違いなさそうですが、
戻ってきたヘッダが、その後のcgiを無効にしちゃっているみたいです。
>359
おっしゃるとおり、外部ファイルにカウントしているので、
php自体は。あくまでも実行させるだけで、
返ってくるヘッダは無用なのです。
さっそく
my $php_res = `/usr/local/bin/php ○○.php`;
for (split/\n/,$php_res){
print "$_\n" unless(m/^Content\-type:/i);
}
と記述してみましたが、戻ってきたヘッダが邪魔をして
cgiのプログラムが まるまる表示されてしまいます。
php自体は実行させているようです。
戻り値に Content-type ですよね!?
たぶん、入っていないかと。。。
phpのほうは、
<?php
?>
ではさんでいます。
- 361 :nobodyさん:2008/07/07(月) 05:51:43 ID:???
- >>360
なあそれ、phpの呼び出し云々ではなくて、cgi(perl)のほうは正常に動いてる?
(例えば、print "hellow world"だけとか、php呼び出し部分をコメントアウトするとかして)
> cgiのプログラムが まるまる表示されてしまいます。
コレ見るに、その"別のレンサバ"とやらに移したときに、*.cgiに実行権限がないとか、
実行が許可されてないディレクトリに配置したとか、そこらへんは大丈夫か?
phpの戻り値に"Content-type"ヘッダがあろうがなかろうが、cgiがちゃんと実行されてたなら、
そのcgiのソースが表示されるってことはないと思う。
(仮にヘッダ出力がおかしくても、500 Internal Server Errorとかになるハズ)
- 362 :nobodyさん:2008/07/07(月) 10:16:19 ID:???
- 問題がカウントだけなら、掲示板でカウントしちゃったら?
- 363 :nobodyさん:2008/07/07(月) 12:28:07 ID:???
- hello
- 364 :nobodyさん:2008/07/07(月) 12:43:24 ID:???
- 世界
- 365 :うっとりハムちゃん:2008/07/07(月) 15:24:36 ID:Q4oOUlGo
- 皆さん、度々レスありがとうございます。
CLI版PHPのサーバーでは問題なく動いています。
CGI版PHPのサーバーだとcgiも動いていますが、PHPのヘッダが
戻ってきたのが影響してプログラムがテキストで表示されちゃいます。
ちなみにcgiの実行権限等は大丈夫です。
たしかに今回はカウントに関してのみなので、
別の策を考えたいとも思っていますが、
今後も同様の悩みを抱えると困るので、
できれば解決したいと思い、皆さんのお力に頼ってしまっているところです。
- 366 :うっとりハムちゃん:2008/07/07(月) 16:51:12 ID:???
- サーバー会社がPHPをCLI版に設定してくれ、無事に動作しました。
数日に渡り、皆さんに親身に相談にのっていただき、大変嬉しかったです!
お騒がせしました。 m(_ _)m
- 367 :nobodyさん:2008/07/07(月) 20:11:38 ID:???
- my $calc = new Math::BaseCalc(digits => [0,1]);
を、->を使って
my $calc = Math->BaseCalc->new(digits => [0,1]);
と書いても大丈夫ですか?
- 368 :nobodyさん:2008/07/08(火) 00:16:28 ID:???
- you,まずやってみなyo!
質問はそれからだ
- 369 :のの:2008/07/08(火) 00:36:18 ID:???
- yomi-search Ver4.21が携帯で使えるように改造中です。
INランキングはリフレッシュジャンプを使っているので、携帯によってはリフレッシュジャンプが出来なくて
真っ白なページが表示されてしまいます。そこで、
sub r_link{
#(2.1)アクセスジャンプ処理(&r_link)
if($EST{rev_fl}){
$FORM{id}=~s/\D//g;
if($FORM{id}){
local($fl=0,@ref_list);
$FORM{id}=~s/\n//g;
&lock_rev();
open(OUT,">>$EST{log_path}rev_temp.cgi");
print OUT "$FORM{id}<>" . time() . "<>$ENV{'REMOTE_ADDR'}\n";
close(OUT);
&unlock_rev();
}
}
$EST{location}=0; #refreshジャンプにする
&location($EST{rev_url});
}
の&location($EST{rev_url});をprint<<"EOM"〜EOMに変えて、htmlタグを記入したら、PCとソフトバンクではきちんとページが表示されるのに、auではタグがむき出しになります。
何かよい方法はありませんでしょうか。
- 370 :nobodyさん:2008/07/08(火) 12:58:18 ID:???
- 改造スレ池
- 371 :nobodyさん:2008/07/08(火) 14:12:44 ID:???
- 1から9までの4つの数字からできている配列の中で、重複した数字をヒットさせるには
どうしたらいいでしょうか。
たとえば
@suuji = (5,4,5,4)の時
@suuji = (3,3,3,3)の時
@suuji = (1,2,9,9)の時
などです。
if($suuji[0] ==$suuji[1])||($suuji[0] ==$suuji[2])||(略) )
{print "重複してるよ\n";}
のようにひとつひとつチェックしていっても可能ですが
もっとすっきり書く方法があったらお願いします。
- 372 :nobodyさん:2008/07/08(火) 14:27:25 ID:???
- if($suuji[0] ==$suuji[1])||($suuji[0] ==$suuji[2])||(略) )
{print "重複してるよ\n";}
ねーよwwwww
- 373 :nobodyさん:2008/07/08(火) 14:53:48 ID:???
- ねーですか。
普通はどう書くんでしょうか。
- 374 :nobodyさん:2008/07/08(火) 14:56:36 ID:???
- sub test {my %U;1 <= grep $U{$_}++,@_}
- 375 :nobodyさん:2008/07/08(火) 15:22:07 ID:???
- えーと難しいですね
配列から重複した要素をgrepで取り出して
その数をカウント…でいいんでしょうか
- 376 :nobodyさん:2008/07/08(火) 17:03:27 ID:???
- >>375
ハッシュテーブルさえ理解してればどの様にでも出来る。
このスレの>>12->>15あたり読め。後は自分で応用しろ。
- 377 :nobodyさん:2008/07/08(火) 17:10:18 ID:???
- あ、例を書くの忘れてたw
@res = keys %{ { map{ $_, 1 } qw( 1 2 9 9 ) } } ;
- 378 :nobodyさん:2008/07/08(火) 17:29:42 ID:???
- ありがとうございました。
まだ完全には理解しきれてませんが、
なんか見えてきた気がします。
- 379 :質問:2008/07/08(火) 23:51:46 ID:ELkvWtkp
- 誘導されてきました。
送信ボタンを2回押さないとframe2へ出力されなくて困っています。
送信ボタンを1回押すだけで出力できるような方法を教えてください。
現在の構成ですが、
A.cgi
<form action="B.cgi" target="frame2">
と作成しています。
A.cgiではチェックリストを作って、選択したデータ(装置名)を取得するようにしています。
送信ボタンを押すとB.cgiが実行されてその結果をframe2へhtmlで出力するようにしています。
vi B.cgi
@取得したデータをCファイルへ書き込み
A取得したデータをhtmlで出力
B ` D.pl` を実施
vi D.pl
D.plがすでに起動していれば、改めてD.plを実行しない(多重起動防止)
Cファイルに何も記録がなければD.pl自体を終了させる
while(-s Cファイル){
Cファイルに何か書き込みが有る場合、
Cファイルを読み込んでその装置へデータをsnmpで取得しに行く
sleep 30;
}
状況としては、チェックリストで項目を選択し送信ボタンを押すと、1回目のB.cgiが実行されるわけですが、
B.cgi内でD.plを走らせている為(30秒ループ)、D.plが終了しない限りB.cgiが終了しないので
結果としてframe2への出力がされないようです。
次に送信ボタンを押すと、1回目のD.plがすでに起動しているので2回目のD.plは終了し、2回目のB.cgiは終了し、
frame2へも出力されます。
- 380 :nobodyさん:2008/07/09(水) 02:49:40 ID:???
- いまいち何したいかわからんけど、
> B.cgi内でD.plを走らせている為(30秒ループ)、D.plが終了しない限りB.cgiが終了しないので
結果としてframe2への出力がされないようです。
D.plを呼ぶ前に「close STDOUT」 してもだめかな?
- 381 :nobodyさん:2008/07/09(水) 03:25:24 ID:???
- >>379
> frame2への出力
ってのが、B.cgiの2.の段階のこと?(多分違うと思うけど。3.の後の`D.pl`の後かな)
D.plを多重起動禁止とか、Cファイルに書き出しとかせずに、
B.cgiからrequireなりで呼び出して、直接その装置(何のだ?)に値するものを引数なりで渡せばええんでね?
で、戻り値をB.cgiから出力と。
これなら、ファイルのロックだとか破損だとか考えずに、B.cgiをいくらでも(cpuとメモリの限り)実行できると思うが・・。
snmpのことはよう知らんから、これではダメなのかも知れないけど。
- 382 :nobodyさん:2008/07/09(水) 07:17:22 ID:bhbbhnXI
- >>381
>> frame2への出力
>ってのが、B.cgiの2.の段階のこと?(多分違うと思うけど。3.の後の`D.pl`の後かな)
そうです。B.cgi内では@ABの順番で記述していますが、B.cgiが終了しないと
B.cgiの処理結果であるAが出力されないようです。
>>380 >>381
今日あたり書かれていることを勉強して試してみます。
- 383 :381:2008/07/09(水) 10:16:07 ID:???
- >>382
あれ、そうなの?じゃあD.plは一体何をしてるんだ?
自分の解釈としては、
A.cgi→フォーム(装置の種類?)を選択→B.cgiでそれを受け取りCファイルに書き出す
→D.plがCファイルの内容を読み取り、snmpからその装置の値(統計?測定値?)を取りに行く
→結果をB.cgiに返す→B.cgiで結果を出力 かと思ってたんだけど・・。
もし言うとおり、B.cgiの2.の部分が出力されないってことなら、>>380の方法か、
(Web鯖がApacheだと仮定して)
$| = 1;
print "Content-type....."
print " " x 256;
とかを、HTMLの出力前にやってみれば?
(確かApacheがcgiかの出力を256byte分バッファリングしたはず。だから最初に256byte分なにかを出力する)
153 KB
[ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]
取りに行ったけどなかった。次は一時間後に取りに行くです。新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 05.0.7.1 2008/07/07
FOX ★ DSO(Dynamic Shared Object)