Perl 初心者コーナー Part23
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
03/05/16 11:18ID:zDRBc/j4【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0813nobodyさん
03/06/04 13:06ID:tEfKxFs60814nobodyさん
03/06/04 13:15ID:???スレ違い
Perl書くのにどんなエディタ使ってる?
http://pc2.2ch.net/test/read.cgi/php/1014357485/
使いやすいエディタって何よ?
http://pc2.2ch.net/test/read.cgi/php/991372719/
0815_
03/06/04 14:11ID:???0816nobodyさん
03/06/04 15:14ID:???http://pc2.2ch.net/test/read.cgi/php/1049514428/301
これに
> 1、goto文なんか使うな!
って書いてある。
漏れも誰かかにそう言われてずっとそれを守っているのだが、
(つーか、使いたい状況になったことはないが)
何で「使うな」のかと今自分に問いただしても答えが出せない。
ぐぐってみても、C言語でgoto文使う香具師は云々はヒット汁が、
perlでは見当たらない。
だれぞ漏れにgoto文使うなの意味を教えれ!
0818nobodyさん
03/06/04 15:48ID:???昔のN88BASIC(構造なんて考えずに何でもあり言語)のころからの諺。
スパゲティになるから。
0820nobodyさん
03/06/04 15:55ID:QLc9Kvie$cgi->is__error and (独自の終了処理);
とすることができるのですが、HTML::Templateのように
自動的にSTDERRに書き込んで終了してしまう物は
どのように自分のスクリプト側でエラーを捕捉することが
できるのでしょうか。
どうかよろしくお願い致します。
0821nobodyさん
03/06/04 16:37ID:yPvJTG3Fttp://www.google.com/search?hl=ja&ie=Shift_JIS&c2coff=1&q=KCatch&lr=lang_ja
つかってますか
0822nobodyさん
03/06/04 16:52ID:gwvKQAZHhttp://yahooo.s2.x-beat.com/linkvp/linkvp.html
0824動画直リン
03/06/04 17:10ID:qArPuVJp0825動画直リン
03/06/04 17:10ID:qArPuVJp0826_
03/06/04 17:23ID:???0828nobodyさん
03/06/04 18:25ID:???0829nobodyさん
03/06/04 19:38ID:???1の方法で@fileに格納していくということを考えて書いてみたのですが、
正常な値が得られず、2の方法なら正常に得ることができました。
この2つは全く同じ動作と予想していたのですが、1と2では
なにが違うのでしょうか?
1、
@file = map { [ split( /\t/, chomp ) ] } ( <FILE> );
2、
while( <FILE> )
{
chomp;
my @array = split( /\t );
push( @file, \@array );
}
0830nobodyさん
03/06/04 19:52ID:???chompの動作を誤解してる。
chompは引数の末尾に改行があったらそれを削除するが、
同時に削除した改行文字の数を返り値として戻す。
その数字をsplitに渡してるだけなので、望んだような結果にはならないだろう。
0831829
03/06/04 20:32ID:???きちんと理解しないまま今まで使用していました。
以下の様に変更したところ正常にどうさするようになりました。
@file = map { chomp; [ split( /\t/ ) ] } ( <FILE> );
0832室長
03/06/04 22:12ID:???是非ヒントをいただければ幸いであります、、、、
ソース
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html>\n\n";
print "<head></head>\n";
print '<body bgcolor="black" text="white">';
print "<b>";
print "\n";
$host = &gethost;
$trueip = &getip;
print ="Remote Host = $host<br>\n"
print "IP = $trueip <br>\n";
print "</b>";
print "</body>";
print "</html>";
exit;
0833室長
03/06/04 22:15ID:???厨なのは分かってますが、どなたかぜひご教授ねがいますです。。。。。
0834nobodyさん
03/06/04 22:22ID:???あのさ・・・
<b>で停止するって事は、
それ以降で問題が起きてるって事でしょ?
&gethost か、&getip ってルーチンに問題があるんでしょ。
そこを晒しなよ。
それと、ヒアドキュメント使った方がいいぞ。
0835nobodyさん
03/06/04 22:28ID:???お邪魔シマスタ、、、、
0836室長
03/06/04 22:28ID:???0837nobodyさん
03/06/04 22:36ID:???#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print $ENV{'REMOTE_ADDR'};
0838834
03/06/04 22:41ID:???おおぉ?
俺、そんな強い口調っぽい書き込みだった・・・?
俺が分かる範囲で付き合ってあげるから・・・・
逃げるこたぁないだろぉ〜
0840nobodyさん
03/06/04 22:46ID:???つか、>>837が一撃で回答を出してるがな。
>>832 は、どっかのソースをパクってきたんじゃないのか?
んで、そのソースでsub getipとかが宣言されてたんだけど、
そこまではコピらなかったとか。
0841室長
03/06/04 22:50ID:???なんか漏れみたいなザコキャラ相手に申し訳ないです。。。
すみませんが後学のために、一つだけ教えていただければ幸いであります。。。
>>837さんのprint $ENV{'REMOTE_ADDR'}; という部分は何をしているのか教えていただけませんか?、、、
おいらの本の環境変数サンプルにもリモートホストの表示部分には
$host = $ENV{'REMOTE_HOST'};
と書いてあり、IPアドレスの部分は
$trueip = &getip;
と書いてありました。。。
やっぱり$ENVって重要だったのでしょうか、、、、
お手数おかけしますが、是非お願いいたします。。。
>>839さん
全部です。。。。。
0842室長
03/06/04 22:53ID:???パクってきました。。。
見ると最後の方にIPアドレスの判断部分として、
sub getip {
if(〜〜〜
っていうのがあったです
必要だったんですか。。。。
厨房でほんと恥ずかしいです。。。ごめんなさいです。。。
0843834
03/06/04 23:20ID:???たしかに。
でも、>>832のソースでのバグ取りの質問でしょ。
>>841-842
おっかしな事言うヤツだな・・・
環境変数って言葉を知ってて、なぜ%ENVを知らない・・・?
%ENVが環境変数その物なんだが・・・
とにかく、まったく分かってない状態だな。
変に触って、レンタルサーバとかに上げるなよ・・・。
迷惑になるから。
最低、簡単な掲示板くらい作れるようになれ。
話はそれから。
0844室長
03/06/04 23:23ID:???そうだったですか。。。。
もっと勉強してから出直してきますです。
皆さん本当にありがとうございました。感謝です
お邪魔しましたです。。。
0846nobodyさん
03/06/04 23:49ID:???0847nobodyさん
03/06/04 23:55ID:nAPG6l61#!/usr/bin/perl
require "jcode.pl";
print "Content-type: text/html\n\n";
$list{sta_kanji} = "春日部"; #駅名を漢字で。
push (@list, \%list);
print $list[0]->{sta_kanji}; #スクリプトのコードがEUCなので、EUCで表示されます。
&jcode::convert(\$list[0]->{sta_kanji},'sjis'); #SJISに変換します
print $list[0]->{sta_kanji}; #SJISで表示されます
の最後の2行で、どうしてjcodeのときには「\」が必要で、
最後の行では\が不要なのでしょうか・・・?
要不要の違いはどこで判断するのでしょうか?
0848nobodyさん
03/06/04 23:55ID:???0849834
03/06/05 00:00ID:???う〜ん?敷居高い?
俺が初めてPerlで作ったCGIって掲示板だったが・・・
本見ながら、必至で作った。
出来上がった掲示板は・・・
返信機能も、Cookieの機能も、改ページ機能も、
何の機能もない、ただ書き込んだ内容がズラズラ表示される掲示板だった・・・
掲示板と言うか、ゲストブックかな?
そこから、いろんな本買ったり、人のスクリプト読んだりで勉強したけど・・・
掲示板が基本だと思うけどね〜。俺は。
0850834
03/06/05 00:05ID:???> $list{sta_kanji} = "春日部"; #駅名を漢字で
ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?
\が必要な時と、必要じゃ無い時は・・・
出力してみろ。
print \$list[0]->{sta_kanji};
print $list[0]->{sta_kanji};
二つの違いを見てみれば分かる。
0851nobodyさん
03/06/05 00:08ID:???まずは他人の掲示板の改造から入るのがいいんじゃないか?
まぁ、大前提としてHTMLをわかってないといけないが。
あ、そうそう。
掲示板の改造とかなら改造スレで質問してね。
0852nobodyさん
03/06/05 00:11ID:???0853nobodyさん
03/06/05 00:15ID:???0854834
03/06/05 00:25ID:O0RMOoYPで、
SCALAR(0x80d55c8)
と出ましたが、わかりません(泣)
スカラー値ということでしょうが、
一体どこのスカラーを差しているのでしょうか?(変な日本語かな)
あと、0x80d55c8っていうのは、なんなんでしょうか?
ググろうかとも思いましたが、そもそもググる単語がわからず。。。
0855847
03/06/05 00:29ID:???あと、
>>850 さん
>> $list{sta_kanji} = "春日部"; #駅名を漢字で
>ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?
いえ、間違いというか、その直後にpush (@list, \%list);してるので。
(@listと%listがややこしかったですね、すいません)
0856nobodyさん
03/06/05 00:29ID:???掲示板って、作ったあとそのまま使えるし、プログラム的にも簡単な部類だし
おそらく世の中にあるCGIでは最も数が多いだろうから、参考にするコードも多い。
Perlを覚える教材としては一番ふさわしいと思う。
そういう俺も、最初は掲示板の改造→自作→その他のCGI、という流れで覚えた。
>>854
それは変数の内容があるアドレス。そこにスカラー値が入ってる。
ぐぐるなら「デリファレンス」。
(本来はリファレンスなんだけど、それだと無関係なほうがいっぱい引っかかるんで)
0857nobodyさん
03/06/05 00:34ID:???sub sub1
{
my $a = shift;
$a = 2;
}
$a = 1;
sub1($a);
print "$a\n";
と
sub sub1
{
my $a = shift;
$$a = 2;
}
$a = 1;
sub1(\$a);
print "$a\n";
を比べて見やがれ。
0858834
03/06/05 00:41ID:???そっか、みんな改造から入ったのか〜。
プログラム入門がPerlだった俺は、死ぬ思いだった・・・
ちなみに、CGIの基本は掲示板だと俺も思う。
Perl/CGIができるヤツに、掲示板作らせたら一発でレベルが分かる。
>>855
見落とししてた・・・。スマン
ちなみに、答えは>>856が答えてる通りで、
メモリ内の、スカラー値が格納されてる番地を表す。
Cのポインター相当。
0859nobodyさん
03/06/05 00:47ID:???習性が身についてたのね。minibbs見たときはぶっ飛んだよ。
0860nobodyさん
03/06/05 01:34ID:???同意
>>851
改造の方が難しくないか?(改造ってHTMLいじるとかそんなんじゃないよね?)
それに1から順を追って作った方が理解できると思う。
0861nobodyさん
03/06/05 01:41ID:???改造ったって、BBSの入力項目一つ増やすだけだって立派な改造でしょ。
それなら簡単だし、変数とかにも触れて、案外入門としてはいいかもとか思ってる。
tu-ka,俺がそうだった。
1から順を追って作ろうとすると挫ける性格なんだよ。
大体、そういうやり方で覚えられる奴はこんなところで質問しない。
0862nobodyさん
03/06/05 01:44ID:???0863nobodyさん
03/06/05 02:24ID:???>BBSの入力項目一つ増やすだけ
って言ってもCGIの入力・処理・出力を全てやらなきゃいけないから辛いと思うんだがなあ。
1から作る方だと、まず出力、次に入力したやつを出力、最後に入力した奴を処理して出力
と段階を追っていけるから理解が早いのではないかと。
改造の方だと一応改造に成功しても、結局中でどういう処理がされているかが分からないし。
俺はプログラマの講師をやっていた頃があって、その経験からこういう結論になってる。
CGIに関しては数回に渡って100人ぐらいに教えたけど、改造させるより1から作らせる方が飲み込み早かったよ。
まぁ個人差があるから全員がそうというわけではなかったから、このように意見が分かれるんだろうな。
0864nobodyさん
03/06/05 02:33ID:???んー、jcode::convertの内部の動きを見てないので想像だけど、
内部的にデリファレンスされた値を受け取って処理できないんじゃないかな。
jcode::convertに特有の仕様だと思うなぁ。
リファレンスについては、
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_toc.html#TOC86
ここを読むといいかも。(結構難しいけどね)
オライリージャパンから出てる「プログラミングPerl」が手元にあるなら
ひたすら「リファレンスとネストされたデータ構造」の章を読む。
ぐぐるときは「ハードリファレンス」「シンボリックリファレンス」なんて
キーワードを使ってみるといいかも。
0865nobodyさん
03/06/05 02:38ID:???俺は逆に、「人の作ったものの改造」が苦手だ。
(悪い例かもしれないけど)某K○NTのBBSスクリプトとか
拾ってきて、さていじろうと思っても、
どこがどこの処理をしてるのかサパーリわからん。
今にして思えば、変数のスコープがぐちゃぐちゃしてたから
わかりにくかったんだろうけどね。
掲示板で勉強していくなら、「この掲示板と同じものを自分で作ろう」
っていうのが一番いいと思うな。
改ページとか、どうやるんだろうって処理は既存のものを参考にして、
あとは自分の手で書いたほうが結局は理解が早い。
あと、モジュール使うと非常に勉強になるね。
使い方をマスターするために必要な知識がたくさんあるから
結果としてそういうものも身に付いていく。
0866nobodyさん
03/06/05 02:48ID:???基礎(%ENV,QUERY_STRING,PATH_INFO,type="file",etc.)を身に付けるためにも。
結局は外部モジュール使うようになる(し、そうすべきだ)けど、
この辺の遠回りは無駄にはならないと思うし。
>>865は分かってるだろうけど一応。
0867nobodyさん
03/06/05 02:52ID:???プログラマ板のデスマーチ大作フラッシュを見て泣いてくれ。
スレに関係ないのでsage
0868nobodyさん
03/06/05 02:57ID:ECImrkCL全く同感。
俺も最初は他人の物に手加える方が楽かと思ってたが、
あるキッカケで丸ごと自作のを書いたら、そっちの方が
楽だったし、何よりも頭に入った。
おかげで、他人のスクリプト見ても理解する能力も格段に進歩したし。
他人のもんいじるって言うのは、工数自体は少ないから
楽に感じるかもしれないけど、実はあまり足しにならないし、
いつまでたっても初心者になり続ける罠。
0869868
03/06/05 03:00ID:ECImrkCL方が全然疲れるし難しいと思うよ。まーそりゃ予めいじられるのを
前提としたフラグとかある部分に関してはそんなことないけど。
それに単機能の掲示板作るのって全く難易度高くも何ともないと思うんだけど。
それすら酷って言う奴は…
初心者と認められるにはワンライナー限定っすか?
0870_
03/06/05 03:03ID:???0871nobodyさん
03/06/05 03:04ID:???がしかし、クラスやらインスタンス、淫ヘリ箪笥・・・ちーっとも理解できていません(つД`)
movem.l d0-d7/a0-a6,-(sp)
の頃が懐かしい、、、
0872直リン
03/06/05 03:10ID:C/yWLjzO0873nobodyさん
03/06/05 03:10ID:???あぁ、わかります。
フォーム内容のデコードとか画像アップロードする際の
--------- ←こんなのの除去とか、
「プログラミング言語」とは直接関係の無いことかもしれないけど、
知ってると知ってないじゃ全然違うし知ってなきゃいけないことだし。
俺が初めて買った「Perl/CGI入門」系の本も、
ccgi-lib.plとjcode.plを使えと書いてあったけど、
アレを読んでも何が行われているのかは全くわからないな。
「動けばいい、内部構造など知らん」ってのは
プログラマの立場としてはあんまり良くない態度だわなぁ。
0874nobodyさん
03/06/05 07:30ID:UTEewkkCベクターなどで探してもコマンドラインを使って操作するようなアプリしかなかったのですが、
誰でも操作できるようにコマンドラインを使わないで
クライアントアプリを簡単に作る方法はないのでしょうか?
0875nobodyさん
03/06/05 07:52ID:l4KCIFT80876_
03/06/05 09:06ID:???0877動画直リン
03/06/05 09:10ID:C/yWLjzO0879_
03/06/05 12:06ID:???0881_
03/06/05 14:10ID:???0882nobodyさん
03/06/05 15:51ID:62PtIZ8T希望の暗号化文字を引っ張り出すような関数は
誰か作ってないのでしょうか?
0884nobodyさん
03/06/05 16:23ID:uDBKSvvR0885nobodyさん
03/06/05 18:36ID:???そもそも、アルゴリズムは公開されてるんだし…
そもそも、概出だし…
0886nobodyさん
03/06/05 19:03ID:y1a1B1oZ0888nobodyさん
03/06/05 19:21ID:???<input type="text" name="comment" size="30"> //←メッセージ(たんなる例です)
<input type="submit" name="submit" value="送信する">
これで、admin.cgiにデータ送って、
readparseして、
そして、パスワード認証を済まして、実際にログファイルに記述、というCGIをつくりたいのですが、
html→データに書き込み。すると大丈夫なんですが
html→パス認証→データに書き込み。だと
↑ここでフォームのデータが送られないんですが、どうすればいいでしょうか?
0889nobodyさん
03/06/05 19:25ID:???0890nobodyさん
03/06/05 19:34ID:???perlのことはPerlスレじゃないの?
0891nobodyさん
03/06/05 19:37ID:???0892nobodyさん
03/06/05 19:37ID:???そもそも>888はたまたまPerlを使ってるのかもしれないが、その質問自体は、
Perlに限られた話じゃないから、CGIスレ向けということ。
0893nobodyさん
03/06/05 19:37ID:???0894nobodyさん
03/06/05 19:40ID:???いかんだろう。
アルゴリズムまで許容するとなれば、>>888のような質問もアリでは。
0895nobodyさん
03/06/05 19:44ID:Dbz7wb1chttp://endou.kir.jp/betu/linkvp/linkvp.html
http://angelers.free-city.net/page003.html
0896nobodyさん
03/06/05 19:46ID:???えぇと、ソースといわれると、300行以上ありまして、
ファイルの作成、編集などのツールです。(ログファイルにというのは、簡単なたとえのつもりです。
要するにフォームのデータをパスワード画面を通して(1回余分な部分を通過して)送るにはどうすれば?ということが聞きたかったんです。)
できあがってるんですが、それにパスワードをつけないと危ないので、つけようとおもっているんです。
とりあえず、新規作成の時のhtmlのソースと、
作成のときのcgiのところをさらしますね。
パスワードとかはまったく手をつけてないじょうたいです。
0897nobodyさん
03/06/05 19:47ID:???<title>編集ツール</title></head>
<body>
<br>
<font size="3" color="#97cdee" face="富士ポップ">ファイルツール</font>
<br><br><font size="2">ファイルを新規作成します。</font>
<form method="post" action="admin.cgi">
<input type="hidden" name="s_mode" value="new">
<br><input type="hidden" name="s_type" value="file">
<table border="0"><tr><td>
<font size=2>名前</font></td>
<td><input type="text" name="name" rows="1" size="55"></td></tr> ///←ファイル名
<tr><td><font size="2">本文</font></td>
<td><textarea name="body" rows="22" cols="58"></textarea></td></tr></table> ///←本文
<input type="submit" name="submit" value="送信する" style="30px">
<input type="reset" name="reset" value="リセット" style="30px">
</body>
</html>
0898nobodyさん
03/06/05 19:48ID:???888を見ただけじゃ、readparseって文字見て
恐らくPerlかな、としか分からないだろ。
Rubyかもしれないじゃないか。
ところで、パス認証って、CGIの中でやるやつか?
それともサーバ自体の機能かな?
0900nobodyさん
03/06/05 19:50ID:???require "./cgi-lib.pl";
&ReadParse(*in);
$name = "$in{'name'}";
$parmission = "$in{'parmission'}";
$oldname = "$in{'old_name'}";
$mode = "$in{'s_mode'}";
$body = "$in{'body'}";
$type = "$in{'s_type'}";
if ($type eq "file"){ ///大元で、ファイルの操作か、ディレクトリの操作かを区別
if ($mode eq "new"){ ///新規作成の場合
if ($name eq""){¬_file;}
else{
if (-e $name){&uwagaki_file;}
else{
open(FILE,"> $name");
print(FILE $body);
close(FILE);
print "Content-Type: text/html\n\n";
print "<html><head>\n";
print "<title>ファイル作成完了</title>$style</head>\n";
print "<body>\n";
print "<br><br><center><font size=2>ファイル($name)作成完了しました。</font><br><br>\n";
}}}
0901nobodyさん
03/06/05 19:55ID:???&uwagai_fileは上書き時のメッセージです。
&uwagaki_fileには、open(FILE >$nameなども入っていて、上書きしし、「上書きしました」というメッセージを出す、サブルーチンです。
>>899
えぇと、htmlは省略してしまいましたが、
ファイル、ディレクトリのラジオボタン
新規作成、削除、編集、コピー、属性変更のラジオボタンがり、すべてできるようになっています。
(cgiでhtmlを出力していますが・・)
ですので、submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
0903nobodyさん
03/06/05 19:57ID:???なんでsubmitボタンを押してから入力させたいの?
一緒に入力させればいいのに・・・・
ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK
Perlとなんの関係もないね・・・
0904nobodyさん
03/06/05 20:00ID:???> submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
一度クライアントにフォームデータを全部hiddenで返して、再度passとともにcgiに送るしかないのでは?
0905nobodyさん
03/06/05 20:01ID:???これって、入力画面では、>>897のが送られた場合、
&ReadParse(*in);
$name = "$in{'name'}";
$body = "$in{'body'}";
<input type="hidden" name="name" value="$name">
ってことでしょうか?
0906nobodyさん
03/06/05 20:01ID:???0907nobodyさん
03/06/05 20:02ID:???やっぱりhiddenで送るしかないんですね。。。
>>903さんのおっしゃるとおりパスワードを一緒に入力させればいい話でしたね。。。
0908nobodyさん
03/06/05 20:03ID:???俺フォームメールでこれやって挫折したような覚えがあります。。
ここの住人の方が言ってくれるからにはできるんでしょう。
がんばってみます。。。
でも、一緒に入力するほうが、使用する側としても気分がいいですよね・
0909nobodyさん
03/06/05 20:08ID:???0910nobodyさん
03/06/05 20:09ID:???0911nobodyさん
03/06/05 20:24ID:???0912nobodyさん
03/06/05 20:31ID:???レス数が900を超えています。1000を超えると表示できなくなるよ。