【Perl】初心者コーナーPart11
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/03/27 12:53ID:wAXxxOxPいらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけどなんか質問ある Pert 5.01 】
http://pc.2ch.net/test/read.cgi/php/1015127347/l50
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0587585
02/04/15 18:56ID:8YI2JjdJ自分でもなにをしてるのか分からなくなってきています。
ちなみに、sjisの所をeucにしても一緒でした。
そろそろ動けばいいって作り方から卒業したいです。(泣
0589nobodyさん
02/04/15 20:09ID:???デバッグの基本はプリントだ!
$emailをチェックしている行の直前に、
print "[$email]<BR>";
って入れて、確認しよう。
0590nobodyさん
02/04/15 20:33ID:???&jcode'convert(*hoge, 'sjis')
これを
&jcode::convert(\$hoge, 'sjis');
にしておけ。
0591nobodyさん
02/04/15 20:38ID:YGeSanjU&jcode'convert(*hoge, 'sjis')
これを
exit;
にしておけ。
0593nobodyさん
02/04/15 22:38ID:???掲示板とチャットの違いってスクリプト的に
どのあたりで線引きされるもんですかね?
これとこれみたいな事ができればチャット、もしくは掲示板みたいな
定義があれば教えてください。
0594nobodyさん
02/04/15 22:52ID:G09favcm>582さん、これを作った人とはもう連絡が取れない状況で自営業をしている
友人が困って私に調べて欲しいと依頼が来た次第です。(なので、仕事とは
全く無関係です)
指摘される通り、私にはあまり知識はありません。
別のCGIを拾ってきて、一から作ってみたいと思います。
>582さん、他の似たようなCGIと比較して原因を調査してみます。
ありがとうございました!!
0595nobodyさん
02/04/15 22:53ID:???・リロードの回数が多い(リアルタイムで返事がくる)
・コメント欄がおそらく一行
・「入室」する
0597589だけど誤爆じゃないよ
02/04/15 23:12ID:???デバッグプリントも試してみてくれーーー
0598nobodyさん
02/04/15 23:30ID:???0599nobodyさん
02/04/15 23:39ID:???自動リロードがあったら間違いなくチャットだな。
>593
一部勘違いされがちだが、無料鯖で禁止されるのは「チャット」じゃなくて
「チャットのような負荷の高いCGI」だからな。
「HTML吐出しなどで負荷の少ないチャット」よりも「リロードを繰り返されるBBS」
の方がよっぽど厄介だ。
そういう意図で聞いたんじゃなかったらすまない。
0601nobodyさん
02/04/16 00:04ID:3Tlg2ssNこういうところから画像を一気に拾う方法ってperlだと
間単にできるんですか?
0602nobodyさん
02/04/16 00:11ID:???LWPを使えば結構簡単にできるが、Web上に置くのは勧められないな。
0604nobodyさん
02/04/16 00:24ID:???チャットに限らず、HTML保存させればCGIの呼び出し回数が減るから、相対的に負荷は減る。
0605nobodyさん
02/04/16 00:27ID:???むしろ、共用メモリを使って全てメモリ上でやるのが吉と見た。
0606nobodyさん
02/04/16 00:33ID:???確かにチャットはHTMLでやってもあんまり意味無いよね。
その他にもHTML吐き出しだと運営上デメリットが多すぎる。
0608nobodyさん
02/04/16 01:07ID:???保存したログ読んでそっから別のHTMLに書きだすって真似やってたら
HTML吐き出しの方がきついんじゃない。
チャットってリロード以前にその性質上ROMより
書き込むことのほうが多いから。
0609nobodyさん
02/04/16 01:11ID:???リロード時の話じゃないけれど。HTML化すると投稿時の動作が
「データをPOST → レスポンス取得」から
「データをPOST → 302 Found取得 → ブラウザがhtmlをリクエスト → 結果取得」
になるので、投稿時の体感速度は確実に遅くなる。低速回線だと少し厳しい。
それにHTML化は参加者:ROMの比がROMに偏っていない限り余り意味が無いと思われ。
0610604
02/04/16 01:17ID:???それは確かにその通りだ。
ごもっとも。
オートリロード先をHTMLにしておけば多少は軽減になるかな?
メタタグとかでnocacheにしておいて。
0612nobodyさん
02/04/16 03:38ID:Z11bRvgCいるLightChat のログを表示するためのCGIの一部です。
#管理人の私がコソーリROMるため(w
1. foreach $chatlog (@chatlog) {
2. ($name,$dmy1,$dmy2,$mail,$actime,$cont,$ip1,$ip2) = split(/<>/,$chatlog);
3. if ($cont =~/<b>\[/i){
4. $cont =~ s/<b>\[/<>/g;
5. $cont =~ s/]<\/b>/<>/g;
6. ($dmy,$personal,$cont2) = split(/<>/,$cont);
7. $name = "$personal";
8. }
9. print "<a href=\"$mail\">$name</a>> $cont2($actime)<br>\n";
10. # print "<a href=\"$mail\">$name</a>> $cont($actime)<br>\n";
11. print "<hr>\n";
12. }
これで、チャットのログを表示しようと思ったのですが、9行目の $cont2 に他の行
の内容が入ってしまうようです。 なお、3〜8行目を削除して10行目を生かすと
この障害は無くなります。
なにとぞ、よろしくお願いしますm(_ _)m
0613612 補足
02/04/16 03:43ID:???ログの形式は上記の通りです。
0614nobodyさん
02/04/16 04:07ID:???ログ中に <b>[ っつー文字列が無い行では3行目から8行目までの処理がすっ飛ばされて
前に読み込んであった$cont2が表示されているだけじゃないの?
と適当に答えてみるテスト。
0617nobodyさん
02/04/16 13:00ID:???0618612
02/04/16 13:59ID:???あ、本当だ(汗) こんな単純なことに気が付かない私が愚かでした。
鬱だ、書き直そう…
>614-615サンクスコ
06191622
02/04/16 16:52ID:Q1JSTWAi<form action="http://127.0.0.1/cgi-bin/input/input2.cgi" method="GET">
<input type="text" name="name">
<input type="submit" value="実行">
<input type="reset" value="クリア">
</form>
上記のHTMLフォームからデータを入力して、受け取ったデータをファイルに書きこむ処理をしたいのですがうまくいきません。
$query = $ENV{ 'QUERY_STRING' };
open IN, "$send";
@all = <IN>;
close IN;
@all = $query;
open OUT,">$send";
foreach (@all){
print OUT $_;
}
close OUT;
これではエラーが出ます。教えてください。
0620名無しさん@edlin
02/04/16 17:30ID:???なんていうエラーがでるんだね?
とりあえず、ぱっと見、あやしそうなところとして、
@all = $query;
を
push(@all,$query);
に直そう。
06211622
02/04/16 17:58ID:UyNwZUnG$query = $ENV{ 'QUERY_STRING' };
open IN, "$send";
@all = <IN>;
close IN;
push(@all,$query);
open OUT,">$send";
foreach (@all){
print OUT $_;
}
close OUT;
この方法以外でもいいので、教えてください。
バイナリファイルを作成したいのですが上手くいきません。
動作イメージとしては
テキストで「31323334」とあったら、これを変換し、バイナリダンプしたときに、
「31323334」となるようにしたいのです(この例だとテキスト表示すると1234になります)。
試行錯誤しながら、以下のように作成したのですが、
テキストに「0A」があった場合に、その部分が「0D0A」になってしまうようです。
改行コードだと思うのですが、どのように対処すればいいでしょうか?
while ($_ =<F1>) {
$_ =~ s/ //g; #スペース削除
chop; #行末改行削除
$bin = pack("H*", $_);
print OUTPUT $bin;
}
使用しているのは、jperlのWIN32版です。
jperl5.005_03-990403
0627nobodyさん
02/04/16 19:27ID:r+rfWQLJスクリプトのあるフォルダのパスを得るにはどうすればいいのでしょうか。
open OUT, '>./hoge';
などというようにすると、現在の作業フォルダにhogeが作成されて、
必ずしもスクリプトのあるフォルダには作成されません。
そこで、必ずスクリプトのあるフォルダにhogeが作成されるように、
スクリプトのあるフォルダのパスを得たいんです。
0628627
02/04/16 19:36ID:???この変数の値を元に取り出すことにします。
0629hanamogera ◆kkkKkkko
02/04/16 19:44ID:QVh0tmfSとしたとき、@hageの要素数は2ですか?
つまり、$#hageは1になるんですか?
0631nobodyさん
02/04/16 19:59ID:???やってみりゃわかると思うけど2だ。perlfuncのsplitを読むべし。
splitはデフォルトで末尾の空文字列を省略する。
3にしたい場合は
@hage = split /<>/, "hoge<>hogehoge<>", -1;
0632nobodyさん
02/04/16 20:13ID:???0633nobodyさん
02/04/16 20:23ID:???タグの<>を$amp;lt;>に変換すると絶対に文中に<>が出てくることはないから、
CGIでは使い勝手ががいい。
0634nobodyさん
02/04/16 20:24ID:???タイプミススマソ。
&と$を打ち間違える漏れって一体…(鬱
0635627
02/04/16 21:39ID:???map使ってて気づいたんですが、
map { "$_", } (0..5);
を実行すると
syntax error at D:\プログ~1\hoge.pl line 1, near "} ("
Execution of D:\プログ~1\hoge.pl aborted due to compilation errors.
と言われます。
map { "$_" } (0..5);
map { $_, } (0..5);
では問題ありません。
syntax errorになる理由は何なんでしょうか。
0637nobodyさん
02/04/16 22:21ID:???なんで最後に , を付けたいの?
0639635
02/04/16 22:38ID:???map { $_, } (0..5);ではエラーでないのに、
$_を"$_"に書き換えるとエラーになるのが納得いかないんです。
最後に,をつけてるのは
use Getopt::Long;
our %config = (base_uri => 'http://www.2ch.net');
GetOptions map { "$_:s" => \$config{$_} } keys %config;
print $config{base_uri};
みたいに使いたいからです。
今はmap { "$_:s" => ...をmap { $_ . ":s" => ...にして逃げています。
0640635
02/04/16 22:42ID:???同じようにエラーになります。
0641637
02/04/16 22:59ID:???とりあえず動くだけなら
GetOptions map { ("$_:s" => \$config{$_}) } keys %config;
にしたら動いたけど・・・・・・演算順序の関係かな?
0642nobodyさん
02/04/16 22:59ID:???perldoc -f map
0643635
02/04/16 23:15ID:???いえ、読みにくい文書ですみませんでした。
perldocによると、
%hash = map { "\L$_", 1 } @array # perl guesses EXPR. wrong
%hash = map { +"\L$_", 1 } @array # perl guesses BLOCK. right
%hash = map { ("\L$_", 1) } @array # this also works
とのことです。
>>641さんの解決策は三番目にある方法ですね。
有り難うございました。
>>642さん、有り難うございました。
perldoc読むの忘れてました。申し訳ないです。
06441622
02/04/17 14:48ID:v8Tp5NVP$query = $ENV{ 'QUERY_STRING' };
open IN, "$send";
@all = <IN>;
close IN;
push(@all,$query);
open OUT,">$send";
foreach (@all){
print OUT $_;
}
close OUT;
この方法以外でもいいので、教えてください。
エラーログにPremature end of script headersと出ています。どうしたらいいのですか?
0645nobodyさん
02/04/17 15:29ID:79RKjLpbgoogleでいろいろ調べましたけどありませんでした。
0647Dream 黒星
02/04/17 16:01ID:???CGI の質問ならスレ違いだろ! って、そのエラーログ見て解決できんのか!
>645
以下にアクセスしろ!
ttp://perldoc/-m/Benchmark/
0649Dream 黒星
02/04/17 16:46ID:???なんで回線切ってなんだ?
自サーバでCGIやってるかもわからんだろうに。オマエは頭の弱いヤツだろ!
0650645
02/04/17 16:48ID:PRS3jaLVJperlを入れるとドキュメントも日本語になるんでしょうか?
0651645
02/04/17 16:51ID:???鬱だ詩嚢。
0652nobodyさん
02/04/17 17:00ID:???スクリプト1行目のperlパスが間違ってるとか
0653645
02/04/17 17:09ID:PRS3jaLVよく見てみたらあまりにも馬鹿な質問してる。
逝ってくる。
0655hanamogera ◆kkkKkkko
02/04/17 17:23ID:7mM3jrq9ありがとございやした。
0657Dream 黒星
02/04/17 17:57ID:???0658632
02/04/17 18:59ID:???1.まず、そのスクリプトをCGI経由じゃなく、単体で起動したときに、
syntax error等くだらないエラーがでて無いか確認。
2.スクリプト自体がOKなら、スクリプトの最初に
print "Content-type: text/html\n\n";
と入れる。
これでOK。
Premature end of script headers
てーのは、必要なヘッダ(Content-type)が書き込まれてないってエラー。
0659Dream 黒星
02/04/17 19:37ID:???2chで書きこんだマシンとCGIやってるマシンが同一である根拠はまだ
どこにもしめされてないだろ! 決め付けでしか考えられないオマエは
もう、ダメポだな!
0660Dream 黒星
02/04/17 19:50ID:???2chに書き込んだマシンとCGIやってるマシンが同一だという根拠は?
決め付けで判断するようじゃ、オマエはもうダメポだな!
はなしにならんな、このうすらハゲがっ!
0661nobodyさん
02/04/17 20:01ID:???やるかっ このっっっ!!!!
0662nobodyさん
02/04/17 20:01ID:???0665nobodyさん
02/04/17 20:12ID:???0666nobodyさん
02/04/17 21:40ID:???0667ADSLにしたんですが
02/04/17 21:44ID:BaxakOe1[症状]
ログインはできてファイル受信状態でフリーズまたはタイムアウト。。
なんでしょうかね?
0670nobodyさん
02/04/17 21:59ID:???−操作説明−
_
_|\\_ 。 【 死 】
|\_ _\→ (>>669)_ | ̄ ̄ ̄|
\| \ \__| 三 (*゜▽゜) | |
 ̄\| ̄| 三 (∪∪) | |
 ̄ ∪∪ | |
※右キー以外は使用しません。
0672ADSLにしたんですが逝きました!
02/04/17 22:04ID:BaxakOe10673Dream 黒星
02/04/18 00:38ID:???なんで 469 のような無知な野郎といっしょにするのか、オマエの推論の
のまずさは後々ダメポに匹敵するほどのミスをやらかしそうで心配なのは
わたしだけならいいのだが...
0674nobodyさん
02/04/18 12:08ID:CQh2avKk$dic{"apple"} = "りんご";
としたときに、valueである"りんご"からkey"apple"を検索するには
どうすればいいんでしょか?
0676nobodyさん
02/04/18 12:56ID:???foreach $keys (keys(%dic)){
if($dic{$keys} eq 'りんご'){ print "ハッケソ $keys\n"; last; }
}
とか。
0678nobodyさん
02/04/18 14:32ID:???%rh = reverse %h;
ってのも使える。
0679674
02/04/18 17:19ID:pC0blCKC>>678 の reverse が一番近いかも。どうもでした。
0680nobodyさん
02/04/18 19:13ID:BWtEryOiとなっている$textの中身を、
"URLは、<a href="http://www.hogehoge.com">http://www.hogehoge.com</a> です。"
という風に、書き換えるにはどうすればいいのでしょうか?
0681nobodyさん
02/04/18 19:24ID:???正規表現を使う。
0682nobodyさん
02/04/18 20:14ID:???$text = "URLは、http://www.hogehoge.com です。";
$text =~ s{URLは、http://www.hogehoge.com です。}{URLは、<a href="http://www.hogehoge.com">http://www.hogehoge.com</a> です。"};
これが不満なら日本語を勉強してから質問しろ。
0683nobodyさん
02/04/18 21:10ID:???もちっとスマートにするなら、
$text = "URLは、http://www.hogehoge.com です。";
$text =~ s{URLは、(.+) です。}{URLは、<a href="$1">$1</a> です。"};
かな。
■ このスレッドは過去ログ倉庫に格納されています