Perl コーディング初心者質問コーナー Part31
>>634 サーバ変われば世界が変わる。
>>635 とりあえずCGIとPerlは違うぞ、とお決まりの一言。
まぁJavaScriptでやるのが妥当だと思う。
>>635 具体的か、、んとねぇベルトある?
あれをねぇ、こう何処か高くて丈夫なところに固定するんだわ
でねぇ、椅子を持ってきて椅子に立ってから首にそのベルトかけて
一気に躊躇せず椅子をけり倒すのよ。
要するに氏ねってこった
>>612 みたいに親切に答てくれている人のレスを無視してどうやるの?を繰り返すアホが一番嫌われる。
>>635 うるせーぼけ、CGIが一体どんな仕組みで動いてるのかから勉強しなおしやがれ。
とにかくお前のやりたいことを言葉を尽くして説明してみろ。
そしたら適切なスレに誘導も、無理だと判断するのもできるだろうに。
まあ、普通だったら、
>>612 の回答で充分なんだがな。
そしてWeb製作板のJavaScriptスレにいけ。
もし万が一、「ブラウザで表示している画面は変えずに鯖にデータを送る」とかだったら、
それこそhttpプロトコルのステータスから勉強しないと駄目だろうけどな。
>>628 Client side PerlScript使えば出来るよ。頑張って。
>>631 A.サーバーのhttpd.confや.htaccess で設定。(アクセスされるのがhtmlファイルなら)
AddType "text/html; charset=Shift_JIS" .html
B.CGIでHTTPの応答ヘッダにcharset指定を出力する。
print "Content-type: text/html;charset=Shift_JIS\n\n";
C.HTML内のMETAタグで指定。
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS" />
>>631 気になるも何も、ただの偶然だろ。
HTMLなら、headの中にmetaタグで文字コード指定するのは作法だし、
CGIでも、ヘッダー吐き出す時に文字コードを指定することもできる。
二重の方法で文字コードを(特に苦労もなく)指定させられるんだから、
できるだけのことをしておくのがいいんだ。そうすれば悩まなくて済むんだから。
643 :
612 :04/01/23 00:03 ID:xQAZE2aU
アイムソリー janeのナンバーずれててわからんかった。
644 :
612 :04/01/23 00:10 ID:???
申し訳ありませんでした。もう消えますけど >>もし万が一、「ブラウザで表示している画面は変えずに鯖にデータを送る」とかだったら、 それこそhttpプロトコルのステータスから勉強しないと駄目だろうけどな。 そのとおりのようです…。 さようなら…。
↓次どうぞ
646 :
631 :04/01/23 00:14 ID:pEpaeS+A
>>642 ありがとうございます。
運用上、現ソースを変えずに対応できたら・・・と考えていましたが変えるのが一番ですね、やってみます。
647 :
617 :04/01/23 00:30 ID:RailRybc
>>623 ありがとうございました。解決しました。
>>631 違う。ソース変える必要は"たぶん"ない
httpd.conf で、 AddDefaultCharset が on になってるだけだろ
>>もし万が一、「ブラウザで表示している画面は変えずに鯖にデータを送る」とかだったら、 それこそhttpプロトコルのステータスから勉強しないと駄目だろうけどな。 元の質問からそこまで読めなかったなぁ。 でも、通常のCGIではステータスコード返せないんじゃなかった? nph scriptの他に、見かけだけの動作でも良いのなら、 HTMLだけでも幅ゼロのフレーム作ってformタグのターゲット属性で指定って方法もあるよ。
metaタグ、ヘッダ(AddDefaultCharset)のほかにYahooみたいな手もあるよ。 今見たらソースの頭に 京 が入ってた。EUCで。
まさか今の世の中に「京」の話題を聞くとは思わなんだな。
ローカルでテストしてるときに apacheを立ち上げ、ブラウザでテストしapacheを終了すると DOS窓が開いて普段は1秒位で終了してくれるんですが、 処理によっては終了までに5秒くらいかかるのがあります。 こういうのはコードが悪くてどこかで処理が残ってると考えてたんですけど、 どういう理由が考えられるんでしょうか それと、そういう場合に虫を見つけ、デバックする方法はないでしょうか?
654 :
nobodyさん :04/01/23 12:51 ID:38BHYMJU
main.txtに、test1.txt、test2.txt・・・・test10.textを 書き込みたいのですが、各ファイルの文字列を配列に入れて、 main.txtに書き込むというやり方しか思いつきません(下記)。 直接ファイルをファイルに書き込む方法は無いのでしょうか? for($x=1; $x<3; $x++){ open (FH,"kare${x}.wrl"); push(@list,<FH>,"\n\n"); close(FH); } open (FH,">>vmain.wrl"); for($i=0; $i<@list; $i++){ print FH "$list[$i]"; } close(FH);
% cat test1.txt test2.txt … test10.txt > main.txt
>>654 open MAIN, ">> main" or die;
for (map {"text".$_.".txt"} (1..3) ) {
my $buff = "";
open F, $_ or die;
print MAIN $buff while (read(F, $buff, 1024));
close F;
}
close MAIN;
657 :
nobodyさん :04/01/23 17:01 ID:ljQVqc4q
print "Location: URL\n\n"; でターゲット指定はできますか?
>> 656
何かそのmapの使い方には違和感を感じるぞぉ。
素直に open F, "text$_.txt" でいいんじゃない?
>>657 フレームのターゲット指定の事なら出来ないよ
660 :
質問者 :04/01/23 22:31 ID:???
チャット作成についてなのですが、perlのweb cgi でリアルタイムチャットと言うのは可能なのでしょうか。 ポートを作ってそこに誘導すると出来るとか何とか聞いたのですが、 1.誘導の仕方 2.ブラウザからサーバにデータを送る方法 3.サーバで処理したデータをクライアントに送信して反映させる方法 がわかりません(ネットワーク関係です) 概念だけでも良いのでどなたかお教えいただけないでしょうか。
>>660 ぱっと考えてCGIだけでは概念的に無理そうに思うが
「ポートを作る」と言っているところを見ると、
まさか、portをlistenするdaemonみたいなプロセスをCGIの子プロセスとしてforkする、
あるいはCGI自身がそういうプロセスになる(普通timeoutがあるから難しそうだが)
てことか?
662 :
nobodyさん :04/01/23 23:31 ID:cIyX/bzQ
現在ログをHTMLファイルとして吐き出す掲示板を作っています。 動作自体は問題ないのですが、HTMLをファイルとして吐き出す性質上、 パーミッションが606にならざるを得ません。 こうしたHTMLファイルをサーバー上に置いた場合、外部から書き換えられる 危険性があるでしょうか。 まあ、普通の掲示板のログファイルが勝手に書き換えられるというのも聞かない ので大丈夫だと思うのですが。 スクリプトでも埋め込まれると目も当てられないので。 ちと板違いな気もするけど、CGI作成上の問題ということでお許しを。
664 :
660 :04/01/23 23:56 ID:hLe3gFVq
>>661 解凍ありがとうございます。
やり方も全くわからないんですよ。前に一度見たことあるような気もしたんですが行方不明。
人からポートが何とかと聞いたので気になりまして。
新しいプロセスで作る…ですか。それかも知れません。(自作のウェブサーバーに置くので)
しかしブラウザとperlでリアルタイムはできるのでしょうか…。
…回答ありがとうございます(訂正)
>>660 HTMLやJavaScriptでは無理なので、比較的多くのブラウザが
対応しているJavaAppletやflashを使う。
JavaAppletやflashが特定のポートに接続することでデータのやり取りを行う。
サーバ側の仕組みは、CGIっていうよりwebサーバとかと同等のサーバ機能だね。
サーバ側は特定のポートを使える言語であれば何で書いても構わない。
もちろんperlでも可能。
「perl ソケット ポート番号」でググればどんな感じか掴めるんじゃないかなぁ。
668 :
nobodyさん :04/01/24 11:40 ID:3XmXG5Te
>>667 ありがとうございます。javaapplet行ってきます。
669 :
nobodyさん :04/01/24 15:46 ID:RywpiCe0
foreach $n (a,b,c,d) { &sub hoge($n); } これを順番どおりにやっていると遅くなるので、 &sub hoge(a)と&sub hoge(b)と&sub hoge(c)と&sub hoge(d)を 同時にやらせたいのですが、どんな方法がありますか?
>>669 そのソースは動かないだろ
671 :
660 :04/01/24 16:24 ID:3XmXG5Te
672 :
660 :04/01/24 16:27 ID:3XmXG5Te
失礼…。「相手のブラウザに送信して反映させることは可能なのでしょうか」 すみません
673 :
nobodyさん :04/01/24 16:29 ID:ShluMD4z
Webプログラミングの初心者なのですが、基本的なことについて教えてください。 ローカルマシンにあるperlプログラムをHTMLから起動するには どのように記述したらよいのでしょうか? 動的にHTMLを生成とかではなくて、 とりあえずCドライブにあるperlを起動したいだけなんですが。 教えてくんですみませんが、ご教示ください。
少なくとも、ローカルマシン上でWWWサーバが起動してないと無理
ローカルに自鯖を立てなさい。
>>671 相手のブラウザをリモートから強制的にリロードさせてるんじゃなくて
JavaScriptで毎秒データを更新してるんでは?
677 :
nobodyさん :04/01/24 16:46 ID:ShluMD4z
>>674 >>675 言葉足らずでした。
ローカルマシン上でwwwサーバ起動してます。
<A NAME="test"
HREF="c:\test\test.pl">テスト</A>
みたいに書けば動くと思っていたのですが
「次のファイルをダウンロードしています」というメッセージが
出てきてしまうんです。
680 :
nobodyさん :04/01/24 17:07 ID:ShluMD4z
>>678 ありがとうございます。
やってみます。
681 :
nobodyさん :04/01/24 17:49 ID:3XmXG5Te
>>676 いえ、どうやらjavascriptは下スクロールだけのようです。
cも少々見たのですが、send関数という物を使って出しているような感じでした。
perlにもsendはありますがsendしても処理してくれるかどうか…。と気になりました。
>>681 それCGIじゃないぞ。
チャット処理専用の簡易WEB鯖をつくってる。
TimeOutさせずに接続を維持して、(HTMLも閉じずに)
メッセージが投稿されたらクライアントに渡してる。
ざっとソースを斜め読みしてみただけなので間違ってるかもしれんが
あんまり上手いもんじゃないなぁ。
683 :
nobodyさん :04/01/24 18:31 ID:3XmXG5Te
>>682 簡易webサーバー…というとポートを開放して接続を維持している点を言っているのでしょうか。
確かにcgiでは畑違いだったかも知れません…。
一つお聞きしたいのですが、「送ってる」と言うのは後半にあるsend関数でしょうか。
送るだけで大丈夫なのでしょうか。
684 :
yuki :04/01/24 18:42 ID:LIGGezky
685 :
nobodyさん :04/01/24 18:49 ID:c5PUM45j
socketで送受信するアプリは明らかにHTMLでやることじゃないな。 先に出てきたようにJavaAppletかFLASHが良いのでは?
686 :
nobodyさん :04/01/24 18:51 ID:c5PUM45j
>>684 その手には乗らない。お小遣い稼ぎはよそでやって。
ス レ 違 い の 話 題 は 他 へ 誘 導 し て 回 答 せ よ
>for( int i=0; i<MAX_CLIENTS; i++ ){ >if( to[i].IsActive() ) to[i].Send(buf); >} の部分。 鯖だって言ってるのは自分でポート開いて待ち受けして HTTPをテキトーではあるけど、解釈してるところ。 試してないから上手くいくかどうか走らんが、HTMLもソケットも閉じてないから 大丈夫なんじゃないの? ブラウザから見れば読み込みの遅いページを読み込んでる感じ。 っつーか、一つ答えたら二つ質問して返すのかオマイは。
688を書いててふと思ったけど WEB鯖のTimeOutを伸ばせば、CGIでPerlでも上手くいくかもね。 最後に無限ループさせて、チャットログに追加が合った場合、そのつどprintさせる。 JavaScriptでTimeout発生したところで再接続させるとか。 誰か書いてみない?
690 :
nobodyさん :04/01/24 19:08 ID:c5PUM45j
原理的にはうまくいくかもしれないがなんか無理やりだよな。
>>690 うん、それが682で書いた上手くないなぁの本音。
683がなんでこんな変態的なやり方に憧れてるのかは
皆目見当がつかん。
692 :
667 :04/01/24 19:23 ID:???
ブラウザがデータ受信の途中でも逐次表示するのでたまたまうまく動くって感じだよね。
目の付け所はいいと思うけど、なんか無理やりっぽくてスッキリしない。。。
つーわけで
>>667 の発言を「HTMLやJavaScriptでは難しい」に訂正しまつ。
まぁサーバ側はperlでもCでもなんでも書けるので
ブラウザ依存の話はそろそろスレ違いかな。
そうだな、 「このC++のソースをperlで書き直すにはどうしたらいいか」という話ならこのスレでもいいんだろうが、 俺はC++がわかんないのでパス
694 :
660 :04/01/24 20:47 ID:3XmXG5Te
>>688 御回答ありがとうございました。少々調子に乗ってしまい、大量に質問してしまいました。申し訳ありません
色々ヒントをいただいたのでここから先はとりあえず自力でやってみたいと思います。ありがとうございました。
>>691 いや、ここ以外にソースを見れる「リアルタイムチャット」が無かったので
皆様有難う御座いました。
695 :
nobodyさん :04/01/24 20:48 ID:WY1eQpTp
# 自分もそんな変態的なchat作ってた内の一人だったりして。
>>689 原理的にはcgiでも可能だけど、(timeoutさえ回避出来ればsocket使わずとも方法は多数有)
Chatの利用者一人一人がhttpdのコネクションをそれぞれ一つずつ占領する事になるので、httpdのパフォーマンス低下に繋がる。
通常、接続できるクライアントの数には制限があるので、運用前にはこの点をしっかり考える事。
後、ブラウザ側のTimeOutを回避するために常に何らかのデータを送り続けていないと
いけなかった(はず)// ブラウザ依存だろうけど、IE3とか4の時代だったから最近のは知らない
696 :
nobodyさん :04/01/25 00:37 ID:g1HBAOuP
JoyfulNoteで禁止ワードの機能を追加するにはどうすれば良いのですか?
作る動機が単にそう言うチャットが欲しいっていうだけなら、 JavaAppletで作ったIRCクライアントがあったような気がするから それ使うのが一番早い。 #とにかく自分で作りたいんだって思ってるなら別
698 :
nobodyさん :04/01/25 04:02 ID:A2CJsmcE
かなり悩んでます。 Perlでユーザーを追加するスクリプトをコーディングしているんですが、 パスワードの作成で躓いています。 シェルの内容は以下の通りです。 #!/usr/bin/perl open(IN, "userlist.txt"); while($user=<IN>){ @user=split(/,/,$user); `useradd $user[0]`; `passwd $user[1]`; } でuserkist.txtの内容は、 user,pass user1,pass2 です。 パスワードの設定がどうしてもうまくいきません。 どなたかご教授お願いします。
( ´,_ゝ`)プッ
bar.cgiで使ってるfoo.pl内で%param=&httpdecode();とやると空が返り、 bar.cgi内で直接%param=&httpdecode();とやると$ENV{'QUERY_STRING'} を渡した結果が返ってきます。 そういうものなんですか?
704 :
nobodyさん :04/01/25 16:45 ID:A2CJsmcE
703は黙って無視しような。
(´‐`).。o(ID…
>>703 普通は違うと思うけど。
# httpdecode()が何か知らないから、なんとも言えないけど。
707 :
703 :04/01/25 18:39 ID:???
>>706 httpdecode()はPOST(GET)データを切り分けてるだけです。
%param=&httpdecode($data)を%param=&httpdecode()としても
bar.cgi?xxx=xx&xxx=xxなデータは普通に処理していたので、はて?と。
>706の言っているように普通は違う。 だからコードに問題がある。 以上。
その前に日本語をマスターしてきてくれ
>>708 普通は空なわけですね
それがわかれば十分です
711 :
669 :04/01/25 19:28 ID:???
>>670 あわわ、失礼しました。
foreach $n (a,b,c,d) {
&hoge($n);
}
こういうのをhoge(a)とhoge(b)とhoge(c)とhoge(d)と
一緒にやらせたいのです。hogeがとても時間の掛かる処理なので。
どうやったらできるでしょうか。
>>711 一緒にやらせたところで、かかる時間は変わらないん
hoge を別プロセスにして fork すれば、一緒にやってくれるかもしれないが
>>712 の言う通りかかる時間は変わらないのが普通だろうな
>>710 何が普通かお前の言ってるだけの状況じゃ全然わからんって。
勝手に一人合点して面白い奴だな。
人の話聞かない奴だって言われないか?
>>711 変わらないね。
コンピュータは本質的にはシングルタスクだ。
マルチタスクに見えてもそれは、
一定時間Aをやって、次の一定時間はBをやって……と高速で切り替えているだけだから、
順番にやった場合に比べても時間は変わらない。
むしろ、切り替えにかかる時間を考えると逆に長くかかる。
考え方がいびつだなあ。
待ち時間がある、例えば外部サーバに問い合わせに行って戻りを待つようなケースだと、
並列化して待ち時間を重ねることによって処理時間が短くなることも場合によってはあるが、
>>711 のはそういうのじゃないんだろうなあ
たちこまですね
>>714 お前も突き放したいのか答えたいのかわからない奴だなw
>>718 態度を改めれば回答してもいいとみんな思ってるんじゃないのか?
CGIとwinアプリケーションでYahoo!メッセンジャーみたいなのを 作りたいのですが、アレの仕組みってどうなってるんですか? 俺の予想だと、 クライアントからのメッセージをサーバーサイドのスクリプトが 受信すると、それを相手側のクライアントへ送信する…ってのだと思うんです。 そうすると双方のIPアドレスに対してサーバーサイドのスクリプトが データを送受信するってことになります。 CGIから特定のwinアプリケーションに対してデータを送信することでできるのでしょうか? とりあえず、今はwinアプリケーションからCGIへのメッセージの送信はできました。 でも、手動でリロードしなきゃいけないんです。 自動でリロードしてもいいのですが、ほぼリアルタイムで会話したい場合、 2・3秒おきにリロードし続けるのって鯖への負荷って大きいですよね。 だからリロードしなくても、 CGIにデータが到着したら相手側に送信できるといいなあと思っています。 色々調べて頑張ってみます。
質問になってない。スレタイ嫁
おまえらCGICGI言ってるけどな、 CGIが何の略か分かってんの? Common Gateway Internet の略だぞ。 それぐらい知っとけよ。 ついでに他のも教えておいてやるよ。 www … World Wide Window HTTP … Hyper Text Tensou Protocol FTP … File Tensou Protocol POP … Professional Office Protocol (POP2とPOP3とあるが、前者は平成2年に定義され、後者は平成3年に定義された。 その簡便さから現在はPOP3が広く利用されている) PFW … Private Fire Wall CSS … Compact Style Sheet document HTML … Hyper Text Multiaccess Language URL … Useful Resource Locator
>>720 サーバ上のCGIからPC上のブラウザにメッセージをプッシュすることは通常できない。
ブラウザというものが、サーバからプッシュされてくるメッセージを
受け取れる作りになってないから。
サーバ上のCGIからPC上のYahooMessengerにメッセージを送ることなら
Net::YahooMessenger とか使えばできんこともない。
YahooMessengerはメッセージを受け取れる作りになっているから。
ついでに言うと、YahooMessengerの動きについての君の予想は完璧に間違っていて、
メッセージのやりとりはサーバを経由しない。
PC1からPC2に直にパケットが飛ぶ。俗に言うP2Pだ。
つまりCGIともWWWとも関係ないのね。
なので、みんな「そういうのは板違いだ」と怒ってるという話。
724 :
nobodyさん :04/01/26 17:24 ID:cjaNnlMT
print "Content-type:text/html\n\n"; CGIレスキューのフォームデコード処理 $FORM{$name} = $value; } @ID = ("aaa","bbb","ccc"); @PW = ("111","222","333"); $ID = $FORM{'id'}; $PW = $FORM{'pw'}; if ($FORM{'pw'} eq $PW[$_] && $FORM{'id'} eq $ID[$_] && $ID[$_] == $PW[$_]) { print <<"EOF"; <html><head></head><body>OK</body></html> EOF } else { print <<"EOF"; <html><head></head><body>NO</body></html> EOF exit; } CGIレスキューのやつなんですが、ちょっと書き換えたらダメになりました $ID[0]と$PW[0]が合ってるときしか、OKになりません $ID[1]"bbb"さんと$PW[1]"222"を関連付けたりってどうやるんですか お願いします
725 :
◆ymwwFPCsCI :04/01/26 17:42 ID:Aup+rhTJ
本当にくだらない質問ですけど怒らないで下さい。 Linuxを使っていて、ユーザーの自動追加スクリプトを 書いています。 useraddコマンドとpasswdコマンドを自動的に発行するスクリプトは どのようにコーディングすればいいのでしょうか?
726 :
FTP :04/01/26 17:55 ID:D6YSJ/rJ
FTP … File Tensou Protocolなのかぁ〜
File Transfer Protocol と思ってたよ。
有賀と
>>722
cgiってファイルの削除できないんですか? 1年ほど自分の作ったcgiでうpロダやってるのですが、いつも手動です。 フォームに"削除"という項目があり、 該当ファイルNOと削除PASSを放り込めばとりあえず そのファイルにアクセスすることはできなくなるんですけど… 実際のところ、renameで別のファイル名に変えてるだけで削除されてないんですよねw 削除したファイルはDL可能なときのファイル名の先頭に「dust」ってついけてrenameしてます。 「img01762.jpg」→「dustimg01762.jpg」みたいな感じです。 それでファイル名の先頭に「dust」ってついたやつがたまってきたらそれを手動で削除してるんですけど。 Win鯖だから大した作業じゃないけどcgiで削除できたら楽なのに・・・と思ってます。 何かよい方法があれば教えてください。
729 :
FTP :04/01/26 18:02 ID:D6YSJ/rJ
あとはわかるだろ!
>>724 $ID[$_] == $PW[$_]
ってあるじゃん。そりゃ$ID[n]と$PW[n]が同じ数値である時しか一緒にならんよ
>>725 怒んないけど呆れることもある。
>>722 この国はITをいんたーねっとてくのろじぃだと思ってるやつが首相になる国ですぜ
>>728 言い忘れた
CGI≠Perl
ここはPerlの質問するとこ
733 :
728 :04/01/26 18:10 ID:???
734 :
724 :04/01/26 18:15 ID:???
>>730 レスありがとうございます
[""]の数字が、両方0のときにしかOKにならないんです
例えば、$ID[1]と$PW[1]のときにはNOになってしまいます
foreach $_(0..2){
if ($FORM{'pw'} eq $PW[$_] && $FORM{'id'} eq $ID[$_]) {
とかやっても$IDも$PWも[0]じゃないとOKになってくれないんです
foreachって配列を0から順番に処理するんですよね?
なのに、[1]と[2]をわかってくれません
どうしたら、わかってもらえるんでしょうか
なんかうぜぇな 答える気が激萎え
>>734 foreachってのは配列の「中身」を参照する。
foreach $pass (@PW){
foreach $id (@ID){
if ($FORM{'pw'} eq $pass && $FORM{'id'} eq $id) {
#なんかの処理
}
}
}
数字で回したいのなら
for(0..$#id){
}
とか?
要は構文ミス
737 :
724 :04/01/26 18:29 ID:???
>>735 すいません…
出直してきます。ありがとうございました
738 :
724 :04/01/26 18:32 ID:???
>>736 ありがとうございます!
多分に勉強不足のようなので、出直してみます
スレ汚しすいませんでした
739 :
711 :04/01/26 18:36 ID:???
>>716 hogeの内容はデータベースへの問い合わせです。
遅いのは1プロセスあたりのリソースが制限されているからのようなのです。
(ほんとのところはわかりませんが…^^;)
試しに、リストを二分割して、2つのスクリプトで動かしたら早くなったので、
1つのスクリプトの中でプロセスを増やせたらいいのかなと。
forkしてそれぞれ別々な引数を渡すのはどうやればいいのでしょう?
>>734 多分foreachを一回しか回ってないんだよ。
>>736 foreach $pass (@PW){
foreach $id (@ID){
if ($FORM{'pw'} eq $pass && $FORM{'id'} eq $id) {
#なんかの処理
}
}
}
そりゃねぇよ
別人のIDとパスで一致することも有り得るじゃん
print "\n \x23 \n"; $aa = 0x23; print "\n \x$aa \n"; sleep(8); 上の出力は#が出ますが、下のは出ませんでした。 変数で数字を指定するにはどのように記述すればよいでしょうか?
>>742 print"\n \x".$aa." \n";
かな?
わかんねーけど。
age
745 :
742 :04/01/26 19:21 ID:???
>>743 ちょっと違うような気がするんですが。。
print >> "hoge" このなかで関数を開くことはできないのでしょうか? 1+5 = &Culc(1, 5);とか。 hoge
>>742 print "\n ". chr($aa) . " \n";
>>746 君は今日のおっちょこちょいさん大賞だ。
sub calc { return $_[0] + $_[1] }
print <<"hoge";
1 + 5 = @{[ calc(1, 5) ]}
hoge
748 :
743 :04/01/26 19:55 ID:???
749 :
742 :04/01/26 21:00 ID:???
>>725 useraddはsystemで呼び出す。
passwdは--stdinオプション付けてパイプで流し込む。
$aa = 0x23; printf qq|\n %c \n|,$aa; こゆのも。。。
752 :
nobodyさん :04/01/26 21:42 ID:KP+mPnoD
スレ違いだったらすいません。 apeboard+を使ってます。 掲示板に書き込んで、そのページのソースを見ると、 <!--res--> とあるんですが、それを出ないようにできませんか? ちなみにcgi本体もスキンも弄ってません。
754 :
:04/01/26 22:37 ID:???
なんでいまどきPerlなんですか?
>>754 なんでいまどきそんなことを聞くんですか?
何言ってんだYO!今はperlがナウいんだYO!ヤングな女子高生も昨日パールってさぁとか言ってるYO!
やつらは「パァル」だろ。
あるCGIから同一フォルダ内にある別のCGIにあるスカラー変数の値を 取得したいときはどうすればいいのでしょうか?
759 :
720 :04/01/27 00:46 ID:???
>>723 なるほど、ありがとうございます。
直に通信してるんですか。
ってアレ?じゃあ非固定IPなのにどうして・・・
って話は他でします。
ありがとうございました。
requireする
>>758 なんでそんなことをする必要があるのかわからんのだが。
762 :
758 :04/01/27 00:58 ID:???
例えば、チャットでの現在の参加者を普通のHTMLにSSIで表示させるとして、 参加者が格納されている変数をSSIで直接呼び出すことが出来ないので、 一旦別の単純なCGIを用意し、それをSSIで呼び出して表示させるということを 考えたわけです。で、その「単純なCGI」からチャットのCGI内にある スカラー変数を呼び出したいわけで・・・ チャットのCGIをrequireすると、チャット本体が実行されてしまいました(汗)
根本的に発想がおかしいぞ
>>762 スカラ変数というのは、スクリプトの中に存在するわけじゃなくて、
実行中のプロセスの中に存在するものだぞ。
チャットCGIがチャットの参加者を変数に格納したとしても
そのCGIプロセスは、100ミリ秒以内に終了して、変数の内容も失われる。
君のやりたいことを実現するには、
参加者一覧をチャットCGIからいったんファイルに書き出して
(そういうファイルは既にチャットCGIが作っていそうな気がするのだが)、
SSIはそのファイルを読み出す、
という形にするのが良さそうだと思うのだが、どうだ。
766 :
758 :04/01/27 01:39 ID:???
>>765 なるほど、一旦変数の内容をファイルに書き出すのも考えたんですが
迂遠かなあと思って・・・
それで一旦やってみます、ありがとうです。
>>766 >迂遠かなあと思って・・・
ほとんどのチャットCGIがこの形式を採用してるんだが……
チャットCGIをよく読んでみなよ。
チャットデーモンでも立ち上げたら? 参加者書き出さなくてもすむよ、高速だし、たぶん。
掲示板を作成しようと思ってるんですが、 1.$actionにwriteが代入されている yes→logファイルに書き込み $actionにnullを代入 ↓ no ↓ 2.展開して表示 3.書き込みがされると$actionにwriteを代入 4.1に戻る でいいんでしょうか?logファイルからの読み出しは出来てるんですけど、 logファイルへの書き込みが成功しないんです。 もしかしたらそもそもの考え方が間違ってるんじゃないか、と不安になったので、どなたがお教えいただけませんでしょうか。
>>770 掲示板てどれもこんな感じだと思ふ
if ($action eq 'write') {
write_log();
} elsif ($action eq 'delete') {
delete_log();
} elsif ($action eq 'edit') {
edit_log();
} elsif (...) {
...
}
show_log();
exit;
ついこの前、探すより自分で掲示板作ったほうが早いかと思って、 自分で作ったら5時間くらいかかった。がびーーーーーーーーん。 しかも、文字コード上の問題が思ったよりウザかった。 ハッシュのキーにスレのタイトルいれてスレの内容まとめたら、大変なコトになった(←アホ
>>771 書き込みをしたときに、送られてきた$actionの中身で判別する、ってことですよね?
今はまだ削除機能とか搭載できるレベルじゃないので(一昨日からperl勉強し始めたばかりなので)、とりあえずwriteだけ与えてます。
>>770 の考え方で進めていっても問題ないんでしょうか?
774 :
770 :04/01/27 02:46 ID:???
ちなみに、 if($action eq 'write'){ &write } でサブルーチンwriteに飛ばすようにしてます。
>>770 どんな掲示板かにもよるかもしれないが、
俺の場合は…
送信されるデータに書き込みかどうかを判別するデータを付加している。
俺の場合は "mode" なんだけども。
一番上に書き込みフォームがあって、下に何件か書き込みが表示されるタイプ。
こんな感じか。
---------------------------------------------------------------------------
&modecheck; #変数$modeに"mode"の値を入れる
if ($mode eq "write"){&write;} #mode=writeであればデコード&書き込み処理
&htmlset; #HTML書き出し
exit;
---------------------------------------------------------------------------
実際はもっとごちゃごちゃしてるが、
まあ簡単に書くとこんなもんだ。
776 :
770 :04/01/27 02:52 ID:???
>>775 有難う御座います。
うちもそういう掲示板にする予定なんですが、
<INPUT type="hidden" value="write" name="mode">
を書き込みフォームにくっ付ければsub writeに行くように出来る、であってますか?
書き込み送信ボタンを押したときに、writeが送られてないようなんです。
試しに
print $mode;
(うちの場合は$actionですが)
とやっても何も表示されてないので、空のような感じです。
俺フィーバー
>>770 自分で作ろうというのはいいけど、そういうことを聞いているようじゃ
どこかの掲示板のソースを見て何をするべきか勉強したら?
セキュリティ面とかも考えてあるのかないのか不安ありありだし
ここでマンツーマンで教わりながらなんてやめてくれよ
779 :
770 :04/01/27 03:10 ID:???
>>778 「考え方があってるのか?この方向性でいいのか?」
が知りたかったのですが、どちらともとれない言い方をなさるので尋ね返す結果になってしまうのですが。
781 :
770 :04/01/27 03:25 ID:???
>>779 誰もが「それでいいよ」と言わないことでわかるよね
783 :
770 :04/01/27 03:29 ID:???
どこが間違ってるかの指摘もなく分岐のさせ方(訊いてない)を繰り返しされても困りますわ。
他の掲示板のソースで勉強しろと言ってるのに愚痴(訊いてない)を繰り返しされても困る
785 :
770 :04/01/27 03:46 ID:???
>>785 >>776 のようにしてCGIにデータを渡したら、CGI側でも受け取る処理が必要。、
例としては、
sub modecheck{
$buffer = $ENV{'QUERY_STRING'};
@query = split(/&/, $buffer);
foreach (@query) {
($name,$value) = split(/=/);
$form{$name} = $value;
}
これで初めて$form{'mode'}からデータを読めることになる。
これの意味が分からないようなら
>>784 が言うとおり
スクリプトを読み漁ってみた方がいいな。
787 :
786 :04/01/27 09:57 ID:???
>>786 これはGET専用だな、スマソ
GETメソッドとPOSTメソッドの処理の違いは他所で詳しく解説されているので検索してください
宿泊予約システムの改良をしております。 具体的には、料金計算を行ったCGIから連絡先を入力させるCGIに 飛ばし、計算した料金をHTMLに表示させています。 今回、これまで外税表記だった物を内税に修正しておるのですが、 ハッシュ配列に保持した料金を、変数に格納、*1.05しHTMLに出力 させております。 #改良前 if ($FORM{'adult_price1'}) { print "($FORM{'adult_price1'}円)<br />\n"; print "<input type=\"hidden\" name=\"adult_price1\" value=\"$FORM{'adult_price1'}\">\n"; $plan1 = $plan1 . "($FORM{'adult_price1'}円)<\|>"; } #改良後 if ($FORM{'adult_price1'}) { $pinctax = $FORM{"adult_price1"}*1.05; print "($pinctax円)<br />\n"; print "<input type=\"hidden\" name=\"adult_price1\" value=\"$FORM{'adult_price1'}\">\n"; $plan1 = $plan1 . "($FORM{'adult_price1'}円)<\|>"; } 単純にこれだけですが、 「Software error: Execution of /home/sites/*****/*****/hoge.cgi aborted due to compilation errors」 と実行時エラーが発生し改良したCGIが実行されません。 調べた結果、 $pinctax = $FORM{"adult_price1"}*1.05; この記述があるとエラーを起こすようです。 ご教授をお願い致します。
何もしなくてもフォームから渡された値が変数に入ってると思ってる香具師結構いるんだよな しかし態度が気に食わんわ
790 :
bull :04/01/27 10:55 ID:8BzI4/OG
CGIを使用した掲示板で、 投稿フォームを投稿されたメッセージ一覧のページとは別のウィンドで開きたいのですが。 よろしくおねがいします。
>>788 そこは問題ないんじゃないかな?
テストしてみたが動いた
aborted due to compilation errors
↑これでググってみれ
>>790 質問が漠然としすぎだ馬鹿。perlの質問じゃない
>786 >787 ありがとうございます。肝心な >CGI側でも受け取る処理が必要。、 に気付かなかったです。これを元に勉強します。
795 :
bull :04/01/27 11:06 ID:8BzI4/OG
>>793 投稿用フォームの方に特別なスクリプトはかかなくてもよいのでしょうか?
>2ちゃんねるのシステムに近くなるなぁ。
でも2ちゃんって同じ画面にでてますよね?
>>789 > 何もしなくてもフォームから渡された値が変数に入ってると思ってる香具師結構いるんだよな
わかってんだったらそこを指摘すりゃいいじゃん。
> しかし態度が気に食わんわ
まあお前に気に入られる必要性は微塵もないわけだが。
>>795 まず最初に聞いておくけど、<a href="./bbs.cgi?mode=putform" target="_blank">の意味は分かるよな?
bbs.cgiのなかに投稿フォーム画面「だけ」を吐き出すサブルーチンでも組んで、
mode=putform と来たらそのサブルーチンを実行してやればいい。要するに
ログの操作や表示をする部分とは分離させるってわけだ。
>>796 それぐらい自分で調べれば解ることだ。用が無いんならキエロ
799 :
bull :04/01/27 11:23 ID:8BzI4/OG
>>797 リンク先にとぶとかってことだと思ってます。
でも今の説明はわかりました。
投稿フォーム画面「だけ」を吐き出すCGI素材ずっと探してんですけどないんです。
素材CGIのなかの投稿フォームぶぶんだけ抜き出しても動作しないみたいですし。
>>798 なあ、ここ初心者スレだよ?
別に答えを強いてるわけでもないし、造語使って質問してるわけでもないし、
状況だって簡潔に書いて、質問内容もまとめてるんだから、
端から、「何もしなくてもフォームから渡された値が変数に入ってるわけじゃない」で終わる話だったわけだよな?
で、
>>786 がそれについて触れるまでは潜んでて、そんで急に初心者叩きかよ。
「回答しねえんなら黙ってろ」とか言ってるわけじゃないんだ。
ただ、なんで、お前に詰られなきゃならんのだ、ってこと。
>>799 <a href="./bbs.cgi?mode=putform" target="_blank">投稿</a>
これをクリックすると、bbs.cgi に「mode=putform」ってのが送られる。
これをbbs.cgi側で受け取ってから↓のように進める。(受け取りの方法については
>>786 で書いた通りでいいと思う)
if($form{'mode'} == "putform"){ &form; exit; } else { 通常の処理 }
sub form{
print<<"FORM"
Content-type: text/html\n
<この部分に表示したいフォームのHTMLを入れてやる>
FORM
}
漏れもいろいろ試してみてるが、多分これが一番単純な方法と思われ。
>>799 なんでもかんでも君の欲しているスクリプトがあるわけじゃないんだよ
投稿フォーム画面「だけ」を吐き出すCGI素材を探しても見つからんよ
いや、見つかるかもしれないが、それを参考にして、
今あるスクリプトに組み込まなきゃいけないわけ。
結局はperlを少しくらい勉強して、今あるスクリプトがどのように動作してるかを
理解し、その上でそれを弄らなきゃいけないわけ。
で、じゃあ一から教えて下さいとか言い出すかもしれないから言っとくけど、
君に「perlってのはだね」と一から手取り足取り説明するわけにはいかないのはわかるよね?
初心者ってのは右も左もわかんなくて、本当に大変なのはわかるけど、
その分自分で調べなきゃいけないのよ。みんな調べてるの。
本当に君がその機能を実装させたいなら、
ここのテンプレにいくつかリンク貼ってあるでしょ?
そこで少し勉強しといで
>>800 君の言ってることが正しいよ大正解。だからもう来なくていいよ
>>802 >
>>800 君の言ってることが正しいよ大正解。だからもう来なくていいよ
ぐうの音も出なくなったか。教えたくないんなら教えてくれなくていいから命令すんな。
お前には「だからもう来なくていいよ」とか言う権利もないし、そんな身分じゃないんだから。
804 :
724 :04/01/27 14:10 ID:???
動いたよ 超うれしい。涙でました 皆さんありがとうございました。 また、今後ともよろしくお願いします
805 :
nobodyさん :04/01/27 14:16 ID:/ioWy3ty
data.csvが存在しない状態で OPEN(FH,> "data.csv"); を行うと自動で"data.csv"だ生成され書き込まれますが、 サーバにアップすると自動で生成されません。 また unlink("test.wrl"); でファイルを消す作業もローカルでは動作しますが、 サーバにアップすると動作しなくなります・・・。 どうしてなんでしょう;;
>>805 環境がよくわからないので、あくまでも俺のカンで回答するが、
ディレクトリやファイルのパーミッションを疑ってみた方がいい。
apache が suExec を使っていなくて、
ディレクトリやファイルの持ち主がユーザ自身で、
そのパーミッションが 644 や 755 の場合は、
そういう症状が起きる。
807 :
805 :04/01/27 16:47 ID:???
>>806 レスありがとうございます。
CGIファイルや書き込み、削除するファイルのパーミッション
ばかりいじっていて、ディレクトリのパーミッションを見落としてました^^;
ディレクトリのパーミッションをいじったら無事解決出来ました、
ありがとうございますm(_ _)m
>>788 「use utf8」とか宣言してない?していれば、
> print "($pinctax円)<br />\n";
のうち、
「$pinctax円)」の部分が「変数名」であると解釈される。
809 :
bull :04/01/27 17:41 ID:vAUQj7Yj
>>801 >>802 本当ありがとうございました。
何とかなりそうな感じです。
全くです。
自分で勉強してから助けを求めることにいます。
お手数かけてすみませんでした。
>>801 >($form{'mode'} == "putform")
ん?
文字列のときは 「==」 じゃなくて 「eq」 じゃなかったっけか?
文字コードを変換するとき、 $buffer=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; としているのですが、 この場合 「jcode.pl」っていらないですよね?
>>811 >$buffer=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
これはエスケープエンコーディングを元のキャラクタに戻す処理。
jcode.plはキャラクタセットの変換ライブラリ。
文字コード変換だけなら、jcode.plのみ使う。 フォームからデータ受け取るなら両方付けておく。
814 :
811 :04/01/27 21:21 ID:???
815 :
811 :04/01/27 21:22 ID:???
ほんまにわかったんかい
817 :
811 :04/01/27 22:29 ID:???
>>816 はい。
$buffer=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
だけだと文字コードが統一されていないので、
requireで"jcode.pl"を呼び出し、
&jcode'convert(*buffer,'sjis');
をすることによって文字コードをsjisにする。
ってことですよね?
>>817 大正解!!!さすがだ。やれば出来る子だとは思ってたよ。
あ、半角カナ入てっと化けるから注意
pack("C", hex($1)) pack("H2", $1) 俺は後者派
821 :
811 :04/01/27 23:51 ID:???
822 :
801 :04/01/28 07:42 ID:???
カウンタ作成中です。 sub counter { if (open COUNT,"+>test.txt"){ $count = <COUNT>; $count++; print COUNT $count; } else { print "Cannot Open File <BR>\n"; } return $count; } とゆうサブルーチンを読み込んでみると 「Cannot Open File」 となってしまいます。 return $count;してほしいんですが・・ どこが間違ってるのか教えてください。
>>823 つまり 「open COUNT,"+>test.txt"」 ができないってことだよな。
test.txtのパーミッションは合ってる?
825 :
746 :04/01/28 13:05 ID:???
>sub calc { return $_[0] + $_[1] } >print <<"hoge"; >1 + 5 = @{[ calc(1, 5) ]} >hoge なるほど、こうやると関数が呼び出されるんですね。 参考までにこれはどのような考え方をすれば良いのでしょう? #配列を出力するようにみせて、配列内で関数を呼ぶ??? 出力方法として決まった方法なのでしょうか。
ルーチンチンから返ってきた値を配列とみなして表示してるんだべさ
>ルーチンチン なんかツボに入ってワロタw
dat.txtに id1:pass1 id2:pass2 と登録された順に追加していくスクリプトを作成したのはいいのですが これを整形して表示するときはどうしたらよいでしょうか? 一つだけタグ作ってあとは行数分同じタグを出力したいのですが どうすればいいでしょうか?何かわかりにくい質問ですがお願いします
なに言ってるのか訳ワカメ タグ???何が?
>>828 print "<table>\n";
open(IN, "< dat.txt");
while(<IN>) {
chomp;
my($id, $pass) = split/:/;
print " <tr><td>$id</td><td>$pass</td></tr>\n";
}
print "</table>\n";
>>823 それと "+>test.txt" だと書込優先 open なので test.txt の
中身が空になると思うのだが。
>>825 calc() の戻り値から成るリストの無名配列を作り、変数展開
コンテキスト内で配列変数として評価する為にデリファレンス
している。
my $list_ref = [ calc(1, 5) ];
my @list = @{$list_ref};
print "1 + 5 = @list\n";
>>828 printf "<dt>%d</dt><dd>%s</dd>\n", /(\d+):(.+)/ while <DAT>;
…という事か?
変数に入っている物が、(型ではなく)数字か文字列かを見分けるには どのようにすれば良いんでしょうか? 正規表現以外の方法が思いつかなくて。。。
>>832 数字ってか数値な。数字の文字列もあるから
正規表現以外で実現したい動機は?
一つの変数に数値が入っているのか、文字列が入っているのか 分からない状況ってどんな状況だ?
>>833 型は関係ないので数字でも数値でもいいでふ。
正規表現を使うとなんか重いから。
いろんなプログラムで使いまわすための関数(インポート式のモジュール)作ってて、あんま重くしたくないんすよ
>>834 コマンドライン打ち間違えの致命的エラー回避、外部入力からの文字列検査、いろいろあると思いますが…
837 :
823 :04/01/29 00:37 ID:???
>>823 です。ご報告遅くなり、もうしわけありません。
>>824 さん。ありがとうございます!
まさにそのとおりで、test.txtのセキュリティfで
「IUSR_**」にフルコントロール権限をあたえたらできました!
まさかこんなことだったとわあああああ!!
って感じです!Perlに自信がなく、「+>」とかあやっしいいいいー
とか、かなり間違ったところばかり目が行ってしまいました。
さらに
>>831 さん。
えっと・・いろいろ書き換えてやってて、最終的にどうだったか忘れました・・・
ごめんなさい。学校でやっていて、いつのまにか2が読めなくなってて・・・
今、家に帰ってきて書き込んでいます。
みなさまの生暖かい声援のおかげで、どうにかなりました。
本当にありがとうございました。
動機が不明瞭だな。
>>832 'hoge' '123' '44,000' '12foo' bar34'
お前の言う「数字」「文字列」ってのがよくわからん。
上の例をそれぞれ分類してくれ。話はそれからだ。
つか、正規表現で重いって言ってるが、他の処理で軽くなる可能性があるとは思いにくい。
全くの想像だけど一般にいう数字じゃないのかね? 123とか10.5とか 40,000とかの,が入るのは微妙だな
数字と数値を混同するのはよくないと思う
「重い」と言ってる奴はベンチも取らずにイメージだけで言ってるのが多い。
Perl使いならそこまで細かなところに軽さを求めるものじゃないと思う。俺哲学
試しに perl 5.8.2 でベンチマーク取ってみたところ、 if($a == $a+0) よりも if($a =~ /^\d+$/) の方が速かった。 またひとつ勉強になった。
>>839 123これを数字と思って話してました。
44,000は今、数値用の単行演算子と通常の数字演算子でtestしてみたら、44と認識されてるみたいっすね。
と言うか今気付いたんですが、数値用の単行演算子(randとintを実験使用)に 'あああ' とか文字列しても実行エラーにならないんですね!
騒がせておいてあれですが、解決したので引き取らせてもらいます。すみません。
>>842 ちょっと他の処理と実行時間を比べようと思ったんですが、正規表現しか思いつかなかったので。。
確かにながーい文字列を正規表現すると速度に影響は出るけど、 数値チェック程度じゃ影響は出ないよ。 影響が出るとすれば事前の文字列長チェックが甘い。
>>834 数値か文字列のどっちかが欲しいだけなら
$var += 0
$var = "$var"
>>839 みたいなことしたいなら、素直に正規表現使え
my ($agent) = ($ENV{'HTTP_USER_AGENT'}); if ($agent =~ /J-PHONE/){ $method = 'get'; } else { $method = 'post'; } とやってみたんですが、J-PHONEのUAでアクセスしても $methodの中身がpostになっちゃうんですが、どうしたらいいですか?
知らんけど、とりあえず print $agent; とかしてみろよ。デバッグの基本。
>>849 Operaで試してみたら(peraを含む文字の場合、に変更して)、出来ました。
Operaだと、$agent;は出るんですが、IEだと出なかったんです。
他のブラウザでも試すべきでした。
ただ、なぜIEで出ないかは依然不明です。
851 :
850 :04/01/29 04:31 ID:???
言葉足らず print $agent; とやったらUAがOperaでは出たんですが、IEでは何も表示されませんでした。 です
まあUAは自己申告制だから。少なくとも携帯ならUA吐くだろう。
携帯用は作った事ないんで、良く分からないんだけど /J-PHONE/i とかしてみれば。
>853 エラーになりました。
とりあえず、すべての環境変数を表示してなにが取得できているかチェックするのがよろし。 print %ENV;
プログラム板の方でも聞いたのですが、 ほとんど答えがいただけなかったので、こちらでもお願いしてみます。 while(<>) { if (/errorが発生/i) { print; } } を、jperl5005→perl582用に書き換えようとして、 use encoding "sjis"; use open ":encoding(sjis)"; binmode STDERR, ":encoding(sjis)"; while(<>) { if (/errorが発生/i) { print; } } とやったら、実行時間が10倍以上かかるようになってしまいました。 何か対処方法とか、勘違いとかありますでしょうか? 582でも if (/errorが発生/) { print; } や if (/[Ee][Rr][Rr][Oo][Rr]が発生/) { print; } は 10倍時間とかにならないので、/i に何らかの問題(相性?)がありそう、 というところまでは自力でわかったのですが。
857 :
825 :04/01/29 10:48 ID:???
リファレンスについて質問です。 @foo = (0..2, 0..2); $bar{"foobar"}= \(0..2, 0..2); print << "END_OF_PRINT"; @foo @{$bar{"foobar"}} END_OF_PRINT とすると、@fooは012012となるのですが $bar{"foobar"}の方は012だけになります。 簡単に@fooと同じように表現できないでしょうか?
>>858 そのコード実行すると
Not an ARRAY reference at hash.pl line 4.
になるよ。
$VAR1 = { 'foobar' => \2 };
$bar{"foobar"}= [0..2, 0..2];
863 :
nobodyさん :04/01/29 13:30 ID:XNrQ/XgQ
こんにちは、質問ですが、別のサーバーのログに書き込むのってどうやってするんですか? 目的はチャットのログを2つのサイトで共有したいのです。 ちなみに書き込み&読み込みをフルパスでしましたができませんでした。 セーブするファイル形式はtxtでもなんでもいいのでご返事の方よろしくおねがいします。
無理だろ socketでややこしいことしたらできるかな
nfs とか ロックをどうかけるかは知らない
>>863 そうですね・・・
socket使えばできないこともないでしょう。
WinOSならある程度簡単なのを一つ二つ思いついたが…
実用的ではないな。
a鯖のログをb鯖にソケットで送って、 それを受ける側でロック何なんなりもした上で追加すれば出来るので和? ソケット詳しくないんで憶測。
socket を受けるには プロセスが daemon みたくずっと常駐してないといかんような気がするが そういうことってそのサーバ上でできるの?
httpd はじょーちゅーしてるけどなにか?
LWP で POST して、相手も CGI で受けるのなら、OK だな
いっそログをファイルじゃなくPostgreSQLみたいなRDBで管理しる 両方のサーバからDBまで接続しにくれば宜しい ロックもDBのトランザクションで管理すれば勝ち
>>856 理由はよく解らんが、以下は私の想像ということで....
・Perl5.8 では sjis にも対応しているが、内部処理は全て utf-8 で実行
される。
・utf-8 に対応したとき、マルチバイト文字にも大文字・小文字があるため、
照合・置換関数のオプションに"i"を付けたとき、それに対応しようとする。
その処理が非効率的であるために時間を取られていると思われる。
以上の想像が正しいとすると、
while(<>) { if (/error(.*)/i && $1 =~/^が発生/) { print; } }
にすると、かなり速くなると思われるが、どんなもんでしょうか。
873 :
nobodyさん :04/01/29 17:13 ID:3F2OSt0J
$aaa = "aiueo aaa "; $aaa =~ s/\s$//; print "$aaa"; 文字列の最後にスペースが付いたらそれを除きたいのですが、 これだと1個しか取れません。
・・・ ・・・ ・・・ ・・・で?
875 :
nobodyさん :04/01/29 17:29 ID:3F2OSt0J
複数取れる方法を教えて下さい。
$aaa =~ s/\s\s$//;
いいよいいよ、いい空気だw
>>874 ,876
オマエ、いいヤツだな。正直見直した。
880 :
874 :04/01/29 18:47 ID:???
$aaa =~ s/\s$//; $aaa =~ s/\s\s$//; $aaa =~ s/\s\s\s$//; (略 $aaa =~ s/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s$//; これで 16個まで取れるようになりますた
みんな不親切だな $aaa=~ s/\s{20}$//; これで冗長にならなくて済むよ。20の末尾スペースを一気に取り除く技
$aaa =~ s/\s$//$; $aaa =~ s/\s\s$//$; (略 $aaa =~ s/\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s$//$; $aaa =~ s/\s{17}$//; $aaa =~ s/\s{18}$//; (略 $aaa =~ s/\s{32}$//; 32個まで対応しましすた
みんな素直じゃないなぁ。ちゃんと教えてあげようよ、 その方法だと、スペースが4つの時とかにスペースが一つ残ってしまうよ。 $aaa =~ s/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $//; これでスペース40個まで対応だ。
みんなわかってないなぁ $aaa =~ s/.*//; これで何も考えないで済むよ
教えて下さい。 アスキーアートを出力したり、改変する Perl スクリプトを 組もうとしています。使用するフォントは「MS Pゴシック 中 (12ポイント)」(IE標準) です。 この条件下で、各文字の幅を取得する必要があるので、文字が与え られると、その幅(ドット数)を返す関数が必要です。 以下のような関数を作成しようとしたのですが、正直言って疲れます。 もっと「まし」な方法は無いでしょうか? 環境はWin2000 + ActivePerl 5.8 です。 sub get_char_width{ shift @_; return 3 if /.,:;'il/; return 4 if /|!{}jjiI.,:;'il゙/; return 5 if /()[] _f/; : (以下略)
>>887 お前、Pゴシックの「P」はプロポーショナルだって事知ってて質問してるんだろうな。
それなら、HDC取得してGetTextExtentPoint32で取れ。
知らないならあきらめろ。
P-chan
>>889 なんでうちのハムスターの名前しってんだ?
891 :
887 :04/01/30 00:59 ID:???
>>888 とほほ...。
やっぱりそれしか無いですか。
Win API のことはよく解らないので、頑張って
get_char_width を完成させるようにしましょう。
>>891 正直、WinAPI の勉強した方が「マシ」な方法だよ。
ドカタみたいなことすんな。
893 :
nobodyさん :04/01/30 10:21 ID:YQ5dcM/M
perlでtelnetすることって出来ますか? とりあえず、ログインして、ps -aux だけしてその結果を取得できると いいのですが。
894 :
nobodyさん :04/01/30 10:28 ID:r6WYD04X
hoge.shtmlとfoo.cgiがあり、 hoge.shtmlのなかに上下に2つfoo.cgiをexec cgiで呼び出す記述をし、 foo.cgiの方で、UserAgentを見て携帯電話の時とPCの時に処理を分け、 それぞれ表示させてるんですが、 携帯ユーザーの時は、上下2つあるうちの下の方は、 何も表示させないようにしたいんです。 cgiからの戻り値をssiに渡すことができるなら、 cgiから、表示させる文字列に加えて、携帯の時はフラグとして1を返し、 フラグが立ってたら下のexec cgiは実行しないような書き方をすると 出来るのではないかと思うのですが、、 何処を探してもそういうことが出来ると書かれたところを見つけられませんでした。 ssiスレを探しましたが無いようで、こちらに書かせていただきました。 何かいい方法無いでしょうか? #ssi側でUAを判定することで下のexecをさせなくすることはできるのですが、 #cgi内でも表示させる文字列を分けるためUA判定する必要があるので、2度でまなんです
つまりssiとcgiで、変数を共有、若しくは戻り値、引数として値を渡せないかということです。
ここはPerlスレだ
すいませんでした。CGIスレ逝きます
>>742 ,
>>747 に近いと思うんですが、うまくいかないので聞かせて下さい。
POSTで受けた\x82\xb3 とかの文字"列"をSHIFT_JISで
表示させるにはどうすればいいですか?
print "\x82\xb3" とやれば表示できるのですが、
read(STDIN,$str,$ENV{"CONTENT_LENGTH"})で取り出した$strを
printすると、そのまんま表示されてしまいます。
[Fri Jan 30 16:23:59 2004] [error] [client 127.0.0.1] malformed header from script. Bad header=<br><br><br><br><br>: test.cgi, このエラーの原因は何でしょうか? 調べたところヘッダーが不正らしいのですが、不正なヘッダーは出力していないのです。 Perl5.6、Apache2.0.43、Windows2000です。
>>899 さんざん既出の話だが、実際にあるホスト名を使うのはイクナイ。
example.comとか使おうな。
>CGIですのでNet::HTTPが使えるかどうか不明。
標準添付のモジュールでネットワーク扱えるのはIO::Socketだけじゃないかな。
しかもHTTPの面倒は自分で面倒見なくちゃいけないし。
諦めて標準添付じゃないモジュールを使うか、IO::Socketでガンガるかのどっちかだな。
必要なモジュールを一緒に添付するって手もあるが。
>>900 意味分からん。
>>901 >調べたところヘッダーが不正らしいのですが、不正なヘッダーは出力していないのです。
君の調べ方が多分間違ってる。
どうやって調べてどういう結果が得られたから、不正なヘッダじゃないと判断したのか教えてくれ。
903 :
900 :04/01/30 16:49 ID:???
すんません。 "\x82\x97" を "w"と表示させたいんですが "\x82\x97"のまま出力されてしまいます。
>>903 俺の環境では unescape しさえすればちゃんと表示されるんだがな
ひょっとして "\x80" と "%80" がごっちゃになってないか?
>>899 自鯖ならモジュール突っ込む
レンタル鯖で突っ込めないなら、使えるの調べるべし
foreach(qw(LWP::Simple Net::HTTP)) {
eval("use $_;");
my($version) = '$'.$_.'::VERSION';
print "$_ : ".eval("$version;")."\n";
}
って感じで何使えるか調べられるぞ
>>900 $a = "\x82\xb3";
で変数に取り込んでからShift_JISにコンバートは?
print "\x82\x97"で w と表示されるなら取り込めると思うが・・・
906 :
901 :04/01/30 16:58 ID:???
>>902 HTMLで出力するのですが、その際には専用の関数を使って出力しています。
&Header;
print "hogehoge";
&Footer;
またエラー前後でヘッダー関連の変更は行っていません。
また<br><br><br><br><br>という出力もありません。
908 :
900 :04/01/30 17:09 ID:???
>>904 いや、間違いなく\x82です。
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
でデコードしてるんですが、もしかするとここがマズいんでしょうか。
909 :
900 :04/01/30 17:14 ID:???
小出しにすると余計わからなくなりそうなんで、 POSTの読み取り部全部書いてみます read(STDIN,$str,$ENV{"CONTENT_LENGTH"}); @src = split('&',$str); foreach(@src){ ($variable,$value) = split("="); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $cgi{$variable} = $value; } print $cgi{"hoge"};
>>909 printf ("%s", $cgi{"hoge"});
911 :
900 :04/01/30 18:01 ID:kjxlq4kM
>>900 $test = "\\x82\\xb3";
while ($test =~ s/\\x([\d\w]+)//){
$char .= chr(oct("0x$1"));
}
print "$char \n";
913 :
nobodyさん :04/01/30 18:18 ID:LRfxaIu4
IPアドレスが書かれたファイルから一行ずつ取り出して wget
http://www...[取り出したIPアドレス] と言う風に自動でweget接続したいのですが、「while文」というのを
書けばいいのでしょうか?
なにか必要な制御文?ありましたら教えてほしいのです
====== SPAM.txt =======
61.149.25.4 --> wget
http://www... を順に繰り返す
61.149.26.199
61.149.79.7
61.49.138.183...
=======================
おっと。912 の2行目の \d はいらない。
915 :
900 :04/01/30 18:25 ID:???
>>912 ばっちりです、ありがとうございました。
単純に出るかと思いきや、こんな事になるとは・・・。
>>902 hoge.comってあったんですね(汗
失礼しました。
>>905 ありがとうございます、モジュール使う以外に方法はないってことですね。
それで調べて使えそうならその方法で試してみます。
ありがとうございました。
917 :
nobodyさん :04/01/30 18:48 ID:LLMKM8sm
いろんなソースを見ていると GET : { 〜〜〜 〜〜〜〜 } #END OF GET みたいな事が書かれてあったのですがこれはどういうことなのでしょうか? サブルーチンでもないし、オブジェクト指向とかならパッケージ宣言しなきゃ だめですよね? perl初心者で大体の文法などは把握できるようになってきたのですが これだけがどうしても分かりません。 検索しようにも:[が記号の為引っかけることができなくて・・。 よろしければ教えて頂けないでしょうか?
>>906 content-type:text/html;
を吐いてる?
>899 著作権法違反。
>>891 Win32::GUIパッケージのWin32::GUI::FontにGetTextExtentPoint32があるよ。
# 使い方がサパーリ分からなかった。。
>>900 print eval qq{"$str"};
>>901 以前、ヒアドキュメント使っていたら、何かのエラーで出た記憶が。
答えじゃなくてごめん。
>>918 perldocは読んでませんでした。
ありがとうございました。
紹介して頂いたHPやラベルとブロックと言う単語を頼りに
検索することで理解できました。
これからはperldocを熟読していこうと思います。
924 :
900 :04/01/30 21:22 ID:???
>>922 まだ理解できていませんが、表示が一発なのは確認できました
ありがとうございます。
925 :
899 :04/01/30 21:41 ID:???
>>921 どこがどう著作権法違反なのでしょうか。
CGIの想定動作としては、サーバA上のページからサーバB上のCGIを呼び出したときに、
サーバA上の画像ファイルを表示させるといったものなのですがどこかまずかったでしょ
うか?
そして
>>899 の問題はuse Socket使うことで解決しました。
アドバイスをくれた方、改めてありがとうございました。
>925 自分の画像なら問題ないよ。 自分の画像なら別鯖に置く必要性をあまり感じないけどね。 負荷と転送量を増やすだけだし。
927 :
899 :04/01/30 22:08 ID:???
>>926 それは大丈夫…だと思いますが利用者のモラルに任せるしかないですね。
ありがとうございました。
928 :
912 :
04/01/30 22:58 ID:??? >>922 > print eval qq{"$str"};
素晴らしい!目が覚めるようです。