【Perl】初心者コーナー Part16
■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo
02/09/15 15:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0498nobodyさん
02/09/29 22:10ID:???局所的な処理がしたいんじゃないの?
たとえば
$a = 1;
{my$a = 'hoge';…}
print $a;
#結果は1
そんな不思議ならその部分だけ出してみれば?
実際のコードを見ないと、それに確かな意味があるのかどうかはコメントできないよ。
0501nobodyさん
02/09/30 00:54ID:???0502nobodyさん
02/09/30 08:11ID:???C++等ではすごく一般的なコーディングスタイルで
局所的にしか使わない変数が、他へ漏れない様にするために使う
けど、perlでもそういう使い方なのかは知らない
0503nobodyさん
02/09/30 08:58ID:???0504nobodyさん
02/09/30 11:11ID:2MKvRRFxメイン画面⇒掲示板画面⇒投稿⇒掲示板画面
の順で操作をして最後の『掲示板画面』でブラウザの戻るを押したら
投稿する前の掲示板画面が表示されるのですけれども、メイン画面を表示させたいのです。
どうすればよいでしょうか? ご指導お願いします。
0505nobodyさん
02/09/30 11:16ID:???ダウト
スレ違いなのであまり深くは追求しないけど
宣言できることが重要なんじゃなくて、局所的な変数が他へ漏れない様にするのが重要
あとその局所的なコードを他へコピペするときとか
ブロック化してあるとどこからどこまでコピペすれば良いのか一目瞭然だし
0506nobodyさん
02/09/30 11:19ID:???それが仕様と思って諦める
というか自分で「メイン画面⇒掲示板画面⇒投稿⇒掲示板画面」つーフローを書いておきながら
ブラウザの戻るボタンでメイン画面まで戻そうとする事自体おかしいと気付かないか?
素直に「メイン画面へ戻る」リンクを掲示板画面に付けましょう
0507nobodyさん
02/09/30 11:43ID:gw3vjcK1自動で自分のパソコンに保存できるようにしたいのですが
そういうの可能でしょうか。
可能な場合、送信したあと「Webページの保存」のダイアログが出てしまいますか?
できれば送信したら勝手に保存できるのがいいのですが。
0509504
02/09/30 12:13ID:2MKvRRFxメイン画面⇒[掲示板画面⇒投稿⇒掲示板画面]
と最後の要素をひとくくりにして、ブラウザで戻るでメイン画面に戻る
ことはできないでしょうか?
しつこくてスイマセンが、実際とても困っているので。
0510nobodyさん
02/09/30 12:15ID:gw3vjcK1おお、素晴らしい。出来るのですね。
ですが、ちょっとどんな風に書いたらいいか想像できないのでヒントか、
それに近い動作をするスクリプトを紹介していただきたいのですが。
0513512
02/09/30 12:25ID:???スマソ
0515nobodyさん
02/09/30 12:30ID:???0516504
02/09/30 12:36ID:2MKvRRFxどうすれば、よいのでしょうか?
0517514
02/09/30 12:40ID:???0518nobodyさん
02/09/30 14:02ID:???自動は無理と思われ。
とりあえず、URLを入力したら、そこのhtmlを
ファイルに保存するとこから始めてみたら?
それができたら、次はダウンロードにすりゃいい。
0519nobodyさん
02/09/30 15:34ID:???世の中のPCの中は大変な事になってるな。
0520nobodyさん
02/09/30 15:36ID:???locationで[メイン画面]に飛ばすじゃ駄目なん
どうしても戻るボタンでどうにかしたいなら
全て(または一部)の画面をHTML化すればできるかもしれないけど
0521510
02/09/30 15:39ID:???open (DATA, ">>c:\data.txt") || &error("開けません。");
print DATA "あああああああ";
close(DATA);
こんな事が可能だったら・・・誰でもクラッカーになれますね。
という事はやはりhtmlのあるurlを入力してそのページを開いて
javascriptで「ページを保存しますか」のダイアログ出すまでがせいぜい精一杯てとこでしょうか。
0523504
02/09/30 16:52ID:2MKvRRFx初心者なもので、聞いてばかりですいませんが。
具体的にはどうすれば良いのでしょうか?
0525504
02/09/30 18:25ID:2MKvRRFxでは最初から事情を説明いたしますと、小説投稿サイトを作ったのですが
作品画面で
◆作品にポイントをつける
◆作品に感想をつける
の2つの送信ができるのです。
このとき、ブラウザの戻るで直接メイン画面に戻れない場合で、作品にポイントと感想の両方をつけたい場合
●メイン画面⇒(作品選択)⇒作品画面⇒(ポイントをつける)⇒メイン画面⇒(作品選択)⇒作品画面⇒(感想をつける)⇒メイン画面
とユーザーの操作がどうしても冗長になるのです。
それで
●メイン画面⇒(作品選択)⇒作品画面⇒(ポイントをつける)⇒(感想をつける)⇒(ブラウザで戻る)⇒メイン画面
としたいのです。
と少々入り組んだ事情があるのですけれど。
0526nobodyさん
02/09/30 18:36ID:???>とユーザーの操作がどうしても冗長になるのです。
ポイントと感想を同時に投稿すればいいのでは・・・
さらにどうして「ブラウザで戻る」にこだわるのか小一時間問い詰めたい。
投稿されたら、プログラム内で勝手にメイン画面ルーチンへ飛べばいいだけだと思うんだが。
0527504
02/09/30 18:38ID:2MKvRRFxポイントだけ、感想だけ、つけたいというユーザーもいるので。
0528nobodyさん
02/09/30 18:39ID:???>526さんの最後の一行は読みました?
0529nobodyさん
02/09/30 18:49ID:IOB01lXZ今試みてるんですが、
バイナリファイルを複数個送信すると2個目以降が送られてこないんです。
テキストファイルなら複数個同時にいけるんですが、、
0530nobodyさん
02/09/30 19:08ID:???初心者というからにはCGIも拾い物なんだろう
もっと理想に適ったものがどっかにあるだろうから
自分で作る気がないなら別のものを探してきなされ
0531nobodyさん
02/09/30 19:44ID:ImfR65/j出来る・・・よね?
探し方が悪いのか考え方が悪いのか、いまいちこれという情報に
行きつけないのだが・・・。
0532504
02/09/30 19:46ID:???いえ、スクリプトは自作ですよ。
どうすればいいのか分からない部分があったりして、
ネットでも探しましたが、欲しかったモノはなかったので。
ちょっと、今は解答を得られそうに無いので
もう少し、問題が具体的になってきたら、再び聞きにくるかもしれません。
そのときは、よろしくお願いします。
0533x
02/09/30 20:00ID:q3kf4WJx↓ ↓ ↓
http://www.dream-express-web.com/space-trust.htm
0534nobodyさん
02/09/30 20:02ID:???0536531
02/09/30 21:10ID:???さんくす!検索してみますた。
531書いてる時点では良くわかってなかったけど、
むしろOpen3の方が意図に近かったかもしれない。
ラクダ本は今手元にないのでそっちも今度見てみます。
0540529
02/10/01 00:10ID:x+as6bjiSTDIN見てるよ!
ってwebサーバ上にアプしたら普通に取得できますた。
これはwin+ActivePerl+Apacheの罠でしょうか。無念。
お騒がせしました。
0542nobodyさん
02/10/01 04:41ID:???画像なり音なりを受け取った際のPerl側での
ファイル形式判断はどうすればいいのでしょうか?
画像についてはImage::Sizeモジュールのおかげで
判別できましたがその他の形式の判別方法がわかりません。
皆さんどうやって最終的に書き出す場合、拡張子付けしてるのでしょうか?
0543nobodyさん
02/10/01 06:12ID:???アップされたファイルの拡張子を使いまわせば?
どうしても正確に判別したいなら
「GIFはデータの先頭がGIFで始まる。」
「PNGは0x89PNGで始まる。」
「JPEGは7バイト目にJFIFの文字がある。」
こんな感じの情報を探しなさい。
とんでもない量になると思うけど。
0544nobodyさん
02/10/01 07:04ID:???あれ?元ファイル名の拡張子ってもしかして使いまわせるんですか?
cgi-lib.pl使って受け取りデータをフォーマットしてるのですが、
どうもファイルデータを受け取るキーからは、画像なりの実データのみしか得られず
元ファイル名(の拡張子)が得られなくて、バイナリ判別しかないのだろうか
と思ってしまっていたのですが…。
0545nobodyさん
02/10/01 07:54ID:/I8m+twd0547546
02/10/01 08:03ID:???板違いだよ。
××リンク依頼の拒絶文××
http://pc3.2ch.net/test/read.cgi/hp/997085797/
0549529
02/10/01 10:18ID:x+as6bji見事にbinmode(STDIN);してませんですた。
フォームからのテキストやらまざってても問題ないですか?
とりあえず試してみます。
0551nobodyさん
02/10/01 12:40ID:???cgi-lib.plは使ったこと無いからわかんないけど
STDINにはfilename="…"ってデータが他のデータと一緒に送られて来てる。
>>549
問題無し。
0552nobodyさん
02/10/01 14:36ID:???やり方はなんでもいいんですけど自分の想像で書いたら見事に失敗しました。
何がいけないですか。
$url = "http://www.yahoo.co.jp/"
open (DATA, ">>data.html") || &error("開けません。");
print DATA "Location: $url\n\n";
close(DATA);
0553nobodyさん
02/10/01 14:37ID:???中身がそのまま「Location: $url\n\n」だったという事です。
0554nobodyさん
02/10/01 14:38ID:???0556nobodyさん
02/10/01 14:50ID:???絶対動かないけど、その場合
open (DATA, ">>$data") || &error("開けません。");
みたいな発想の方が自然だと思うぞ。
この辺ってsocket関連の情報をあたってみたらどうだろう。
もしくは、CGIプロクシのソースを参考にしてみては?
0557nobodyさん
02/10/01 14:54ID:???えっと、許可をもらっているので今回は大丈夫です。
例がヤフーだったのはよくなかったですね。
>>556
perlでネットワーク関連になるとちょっと知識が無いんです・・・。
掲示板を作れるくらいの知識じゃ厳しいですかね。
0558nobodyさん
02/10/01 14:58ID:???>>481
殊にネットワーク関係は中途半端なことしてると
よそ様に迷惑かけまくるから、
基礎をみっちり勉強してからトライしてね。
0561nobodyさん
02/10/01 15:41ID:???まったくそうですねすいません、
ところでinet_atonにはホスト名をいれるより
直接IPを入れたほうが処理は早いですよね?
0562nobodyさん
02/10/01 16:18ID:???ファイルの受け取りにcgi-lib.plというのを使ってるみたいなんですけど
それを使わないと無理なんでしょうか。
あと、use CGIも無しで。
use CGIを使った場合って
read( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } );
で受け取るのが無効になってしまいますか?
hiddenの受け取りにread( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } );を使って
ファイルの受け取りに$file = $query->parama('file);
をやったらhiddenが受け取れませんでしたので・・・。
0564552
02/10/01 17:01ID:???これが使えそうな気がします。
# Webブラウザスクリプト
# browser.pl
# モジュールの仕様宣言
use IO::Socket;
# URLを入力
print "URLを指定してください。:";
$url = <STDIN>;
# URLをホスト名とファイルパスに分割
chomp($url);
if($url =~ /http:\/\/([^\/]+)(\/.*)/){
$host = $1;
$file = $2;
}else{
die "そのURLには対応していません。\n";
}
0565552
02/10/01 17:02ID:???# ソケットオブジェクト作成
$client_socket = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => 'http',
Proto => 'tcp',
Timeout => '5');
unless($client_socket){
print "Socket Error:$!\n";
}
# 入力をサーバーに送信
print "$host $file" . "\n";
print $client_socket "GET $file HTTP/1.0\n\n";
open (DATA, ">>data.html") || &error("開けません。");
# 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ)
while($receive = <$cilent_socket>){
print $receive;
}
close(DATA);
# ソケットを閉じる
$client_socket->close();
これが全文です。ですが動きますがhtmlソースが出てきません。どこか間違っていますか。
0566552
02/10/01 17:03ID:???コマンド プロンプトから試しました。
0567nobodyさん
02/10/01 17:03ID:???0568nobodyさん
02/10/01 17:21ID:???LWPは使えんの?IO::Socketでも別にかまわんけど。
>htmlソースが出てきません。
data.htmlに出力されているんじゃないかと思うが、
ソース見ると開けて閉じてるだけかよ。
0569552
02/10/01 19:00ID:ydYlCK0mopen (DATA, ">>data.html") || &error("開けません。");
# 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ)
while($receive = <$cilent_socket>){
print $receive;
}
close(DATA);
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
# 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ)
while($receive = <$cilent_socket>){
print $receive;
}
実際はこうやって実験しました。
指定されたhtmlのソースが表示されていくはずなんですけどね・・・。
0570nobodyさん
02/10/01 22:01ID:???unless($client_socket){
print "Socket Error:$!\n";
}
$client_socket->autoflush(1); # これ追加
# 入力をサーバーに送信
...
でどうよ?
while($receive = <$cilent_socket>)
これは綴り間違い?
0571552
02/10/01 22:50ID:ydYlCK0mすごい!出来ました。
下の文がはじめに付いてくるんですがこれって自動で取ったり出来ないんでしょうか。
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Tue, 01 Oct 2002 22:34:16 GMT
Connection: Keep-Alive
Content-Length: 39683
Content-Type: text/html
Set-Cookie: inkid=n92b0EDMgACIgMEZL2zSjaAAVvoH; expires=Wed, 01-Dec-2010 00:00:00 GMT; domain=goo.ne.jp; path=/
Set-Cookie: ASPSESSIONIDGGGQQGED=MMBNNELBNKGNJBKCPGNLGLCG; path=/
Cache-control: private
あと、ローカルではうまくいったんですけど、サーバーにアップしたら、
Your script produced this error: Can't locate IO/Socket.pm in @INC (@INC contains: .) at ./aaa.cgi line 5. BEGIN failed--compilation aborted at ./aaa.cgi line 5.
という風に「use IO::Socket;」の行でエラーが出てしまいました。
0572ヽ( ゚Д゚)丿 ◆1ZwOwwBE
02/10/01 23:40ID:???もうなにからなにまで全然だめみたいだから
ちゃんと本かってある程度勉強したほうがいいよ。
まず、IO::Socketはレンタルサーバーに入ってるのはまれだろ
よくてSocket.pm
つかえても制限ありとかそんなもんだ。
0573ヽ( ゚Д゚)丿 ◆1ZwOwwBE
02/10/01 23:43ID:???こんな感じのをいれる
if(/\r\n/){
next;
}
s/\r\n//o;
0574nobodyさん
02/10/02 00:06ID:???↑のようなことを表示できるようにするCGIってありますか?
0577nobodyさん
02/10/02 01:29ID:???>>488
>っていうかこれは相手サーバに渡す物だから、
>自分の環境がWinかどうかは関係無いんじゃないんですか?
ファイルハンドルが「テキストモード」の時,"\r\n"は
Winだと, 0x0D 0x0D 0x0A に
Unix系だと 0x0D 0x0A になる
っつーことで。
0578nobodyさん
02/10/02 12:31ID:6nY1Hcfpその場合
$mon = sprintf("%02d",$mon);
と書くのと
$mon = "0$mon" if ($mon < 10);
と書くの
どっちがいいと思いますか?
何か二極端になってるような気がして、、、自分は前者です。
0581nobodyさん
02/10/02 13:01ID:???#print "HOST:$host\n";
#print "FILE:$file\n";
print $client_socket "GET $file HTTP/1.0\n\n";
これだと単純に$fileで指定されたファイルが返ってくるんですけど、
$fileがcgiだった場合、例えば掲示板とかの場合に、
掲示板内の投稿内容を入力する<input type="text" name="message">
の値もサーバーに送ることってできますか?掲示板のformのmethodはpostです。
結果的に投稿後のhtmlが返ってくるようにしたいんです。
0582nobodyさん
02/10/02 13:08ID:6nY1Hcfp($mon,$mday,$hour,$min,$sec) = (split(/,/,sprintf "%02d,%02d,%02d,%02d,%02d",$mon,$mday,$hour,$min,$sec));
0584578 , 582
02/10/02 13:40ID:6nY1Hcfpお、忘れてた。サンクス。
0585nobodyさん
02/10/02 15:15ID:JLnBuPbJ1:RS-232Cに繋がったモデムに、ATコマンドを送ってリザルトを受け取りたい
2:googleを「perl RS-232C」で調べてみた
3:そうした事例がでて来ない
perlを使って、RS-232C通信は出来ないでしょうか?
簡単なATコマンドを送って、結果を見るだけなのですが、minicomで手打ち
は面倒くさいので、自動化したいのです。
でも、googleで事例が出ないので、もしかして、perlではRS-232C制御は
出来ないのでしょうか?
もし可能なら、組み込む必要のあるpmや、スクリプト例など教えてください。
環境は、RedHat Linux 7.3
perlのバージョンは、5.6.1です。
0586nobodyさん
02/10/02 15:27ID:???ATコマンド打つにはpppdがいるだろ
Perlだけじゃむりだ
0587585
02/10/02 15:39ID:JLnBuPbJpppdというのと組み合わせるんですか?
今は、minicom -s から手打ちして、結果を見ています。
出来たら、自動でAT打って、返ってきた結果でif分岐して、おかしいときだけ
メールとかで知らせるという風にしたいんですよね。
まず、pppdというのをgoogleしに行って来ます。
何か過不足あったら、教えてください。
0589578 , 582
02/10/02 17:30ID:6nY1Hcfp\$scalar とか \%hash とか、リファレンス参照ですよね
時々見る *scalar とかは一体何者なんでしょうか
おそらくリファレンスと同じようなもんだと思うんですが
いまいち挙動がつかめません。
0590585
02/10/02 17:37ID:JLnBuPbJあ、ほんとですね。/usr/sbin/pppdでありました。
さて、これをどうperlから呼んで、任意のATコマンドを出力させるのか、
調べてみなくてわ。
ただ、googleであたったところ、pppdってどうもインターンット接続のソフト
みたいなんですけど?
0591nobodyさん
02/10/02 17:50ID:???ATコマンドも打てるんじゃ!ぼけぇ!
Linuxさわったのはじめてでperlも分らんようなら帰れ!
どうせ厨だろ。/dev とかわからんだろ
おとなしくじーーーーーーーーーーーっくりしらべてから来い!
0593585
02/10/02 18:09ID:JLnBuPbJはは、いや、Linux/perl、1年くらい使ってるんですよ(笑)
ただねぇ、ルータが最初からあって、接続はLANでって環境でインターネット
に入ったもんで、ATコマンドって、つい最近まで、使ったことも見たことも無
かったのよん。
#Windowsも「ダイヤルアップなんたら」というの、使ったことまったくない。
だから困ってるのさ。
0594nobodyさん
02/10/02 18:31ID:???おめでたい香具師だな。
0595nobodyさん
02/10/02 18:34ID:???だから初心者なんだろ(w
0596nobodyさん
02/10/02 20:11ID:???> print $client_socket "GET $file HTTP/1.0\n\n";
この行の GET を POST にすることを気付かなかったのなら、
まず Socket と HTTP について勉強しる。
>>582
$_ = sprintf '%02d', $_ for ($mon,$mday,$hour,$min,$sec);
こう書いておけば、変数が増えても
一箇所書き換えるだけで済む。
>>585
「Linux perl シリアル通信」辺りでググってみてはどうか?
>>589
* は型グロブ。黒豹本 (O'REILLY「実用 Perl プログラミング」)
の三章に、実際の使用例と共に詳しく解説されている。
■ このスレッドは過去ログ倉庫に格納されています