Perlコーディング初心者質問スレ Part 45
1 :
988 :
2005/12/08(木) 22:48:27 ID:??? Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
2 :
988 :2005/12/08(木) 22:49:46 ID:???
3 :
988 :2005/12/08(木) 22:50:11 ID:???
4 :
988 :2005/12/08(木) 22:50:34 ID:???
5 :
988 :2005/12/08(木) 22:51:00 ID:???
6 :
988 :2005/12/08(木) 22:51:24 ID:???
7 :
988 :2005/12/08(木) 22:53:25 ID:???
8 :
988 :2005/12/08(木) 22:54:09 ID:???
9 :
988 :2005/12/08(木) 22:54:50 ID:???
11 :
nobodyさん :2005/12/09(金) 01:22:40 ID:TPUe6z63
文字コードの問題です。 ActivePerl 5.8.7でTk使ってます。 処理のなかではTkの表示の部分でdecode('cp932',$hoge);としています。 Textヴィジットにユーザーに文字を入力してもらいそれを$txt->getを使って取得した場合、 取得した値のエンコードは何になっていますか?どう扱えばいいですか? どのshiftjisやutfとか指定してもバグってしまい、何をどうしたらいいのやら・・・
HTMLを出力するCGIを作っているのですが、以下のファイル構成で open (F,">list.html"); print F "Content-type: text/html\n\n"; print F "<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>\n"; print F "<head><META http-equiv=Content-Type content=text/html; charset=Shift_JIS><title>aaaaa</title></head>\n"; print F "<body>\n"; print F "<div align=center>\n"; print F "</div>\n"; print F "</body>\n"; print F "</html>\n"; close (F); とするとうまくいくのですが、 open (F,">/list/list.html"); にするとファイルに書き込んでくれません。パーミッションは両方のlist.htmlともに666です。 どなたかアドバイスお願いします。 / | +-- cgi-bin / aaaaaa / aaaaa.cgi | list.html | +-- list / list.html
サーバーには ドキュメントルートとサーバールートがあります。
15 :
13 :2005/12/09(金) 12:06:46 ID:???
>>14 ありがとうございます。ドキュメントルートをサーバールートにしたらうまくいきました。
phpで配列のこぴーはどうしますか?
17 :
nobodyさん :2005/12/09(金) 15:41:16 ID:aD6KYfo9
ドキュメントルートとファイルシステムルート の方がなんとなくわかりやすいな。 チェンジルートしてると必ずしもファイルシステムルートではないのか・・
>>16 ふつうに質問スレまちがいましたすみません。
19 :
nobodyさん :2005/12/10(土) 00:23:57 ID:jGywlXJC
バイナリ(SHA1のハッシュ)比較をしたいのですが、どのようにすれば良いのでしょうか? 数値や文字列用の比較演算子を使うのは何か違いそうな気がしたので。。
>19 eq
21 :
19 :2005/12/10(土) 00:32:32 ID:???
>>20 ありがとうございます(_ _)eqはビット比較みたいなものなんですね。
23 :
nobodyさん :2005/12/10(土) 17:51:34 ID:I7IfvFhx
24 :
nobodyさん :2005/12/10(土) 20:09:08 ID:VtAwQeXl
$hogeの中の <form>〜</form>の間にある<input name="なんとか" value="なんとか">からnameとvalueを抜き出して、 <a href="アドレス?なんとか=なんとか&なんとか=なんとか">ああああ</a> というリンクを書きくわえたいんですが、さっぱりわかりません。 下のは試してみたソースですが、動きません。 どうすればいいのか、だれか教えてください。 (下のは無視してください) while ($hoge=~m/((?:<form>)?.*?<form[^>]*?action=('|")?(.*?)(?:\2| )?.*?>.*?<\/form)/is){ $tmp='';$form=$form2=$1;$action=$3; $form2=~s/(<input[^>]*?name=('|")?(?!submit)(.*?)(?:\2| )?[^>]*?value=('|")?(.*?)(?:\4| )?.*?>)/ ($tmp) ? ($tmp.="&".$3."=".$5) : ($tmp=$3."=".$5);$1;/esgi; $form2=~s/(<\/\s*?form>)/$1<br><a href="$action$tmp">ああああ<\/a>/i; 572 $hoge=~s/$form/$form2/si; 573 }
572 573というのは関係ないです すみません
>>24-25 これで合ってるのか分からんけど。
my $attr = qr/(?:"[^"]+"|'[^']+'|\S+)/;
$hoge =~ s{<form\b([^>]*)>(.*?)</form>} {
my $form = $2;
my $path = $1 =~ /\saction=($attr)/i ? $1 : '/path/to/default';
$path =~ s/^["']|["']\z//g;
my $param = '';
while ($form =~ m|<input ([^>]*?)/?>|gi) {
my($attrs, %attr) = ($1);
($attr{lc $1} = $2) =~ s/^["']|["']\z//g
while $attrs =~ /\s(name|type|value)=($attr)/gi;
($attr{'type'} ||= 'text') =~ /^(?:text|password|checkbox|hidden)\z/i
and $param .= "$attr{'name'}=$attr{'value'};";
}
length $param ? qq|<a href="$path?$param">ああああ</a><br>| : '';
}egis;
以後この手の依頼はこちらへ。
■こんなCGI作ってください■ Part.2
http://pc8.2ch.net/test/read.cgi/php/1133361560/
質問マダァ-? (・∀・ )っ/凵⌒☆チンチン
30 :
nobodyさん :2005/12/11(日) 22:24:54 ID:Ihn+hQ6U
教えてください。お願いしますm(_ _)m $ua = $ENV{'USER_AGENT'}; @ua = ( 'Mozilla','Netscape','Opera','Firefox'); $uaa = @ua; (ここの処理がわかりません) USER_AGENTの中に@uaの配列の中のどれかが含まれてたら真、含まれてなかったら偽を返す if (真のとき) { print "あああ"; } elseif { print "いいい"; }
elseifって、、、perlの質問だよね? (Here's one way to do it) if (grep {/$ua/} @ua) { print "あああ"; } else { print "いいい"; }
for(@ua){ if($_ eq $ua){ $flag = "1"; last; } } if($flag){ print "あああ"; }else{ print "いいい"; }
ヒント:$uaが空
34 :
未承諾広告※ ◆TWARamEjuA :2005/12/11(日) 22:52:57 ID:0eadQ7WE BE:3267465-###
my $ua = $ENV{'USER_AGENT'}; print eval { for ('Mozilla','Netscape','Opera','Firefox'){ return 'あああ' if /$ua/; } return 'いいい' }
35 :
未承諾広告※ ◆TWARamEjuA :2005/12/11(日) 22:53:38 ID:0eadQ7WE BE:5336677-###
あ、そうか、、、(汗)>空のとき
perlで改行の数を得るにはどうしたらいいでしょうか?
改行コードを数えていけばよい。
ヒント HTTP_USER_AGENT
いつからこのスレは質問者も回答者もクオリティ低くなったんだ・・
41 :
30 :2005/12/11(日) 23:41:51 ID:???
皆さんありがとうございます。 HTTP_USER_AGENTの中にかっこが含まれていると真にならないみたいなんです(Mozzila=○、Mozzila 4.0(compatible...)=×) どうすればよいのでしょうか?(;_;)
>>40 君がそのクオリティの高い回答を示さないからだよ。
>41 つ「quotemeta」
乗り遅れたyo。 grep{ /\Q$ua\E/ } @ua; これで実装しても、 $ua = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'; こうなら、 grep { m{\QMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\E} } @ua; これはマッチしないっしょ。
@ua = こうしないとな。
46 :
nobodyさん :2005/12/12(月) 19:58:15 ID:BQNUAhRM
掲示板等で、フォームで受け取った文字を 表示するとき、フィルタリングすべき文字は 「&、<、>」とかありますが、それ以外に フィルタリングが必要な文字はどんなものがありますかね
\x00とか?
2chでも文字化けを利用?して壊れたスレみたいなことになってるのが昔あったね。 SJISでないコードを送りつけたのかどうやったのかは知らないけど。
2chでは送られて来た文字列の文字コードをきちんとチェックしていなかった。 Shift_JISの上位1バイトだけを送っても、そのまま表示されていた。 この状態では、次の1バイト分の文字は漢字の下位1バイトとして扱われる。 ここにタグの"<"や">"があるとタグが壊れる。
なるほどそうだったのか。情報サンクス。
やべ・・・すんまそん
前後に半角スペースでも入れときゃいいんじゃね
二つ質問をさせてください。 一つは通信されるデータ量についてなのですが、 printで表示させたhtml分だけ通信されると考えていいのでしょうか? つまりCGI内の変数に大量の文字列が入っていてもprintされなければ 通信されないのかということをお聞きしたいのです。 何故こんなことを聞くかというと携帯用に作っているのでパケット代が気になるからなのです。 もしCGI内のソース全てにパケット代が生じるのであれば、データは別ファイルにまとめようと思っています。 サーバーで動くCGIであると考えればhtml分だけだと思うのですが不安です。 もう一つあります。CGIは特別な処理をしなくてもダウンロードされる心配はないと考えていいのでしょうか。 つまり第三者にダウンロードされてソースが見られることがあるのか気になったのです。 分かり辛い質問かもしれませんがよろしくお願いします。
前者:そのとおり 後者:パスワード等と記したファイルはドキュメントルートより上に置いた方が良い
なるほど分かりました! ありがとうございます! 人に知られたくないものは上に置きますね。
追伸 速レス頂けたのにお礼の返事が遅れて済みませんでした。
ハッシュのリファレンスを格納した配列同士を、foreachの多重ループで $hoge->{'bar'}=$moge->{'bar'}と記述してしまって、左辺に 値でなくてリファレンスが入ってしまって泣きそうなんですけど、 例えばすべて$hoge{'bar'}[$i]といった多重配列のフォーマットにして 書き直したほうがいいのでしょうか。
>>60 >>1 1: 自分はこういう事がしたい。
何がやりたいのか書いとくれ。それによって適したやり方があるから
ただ配列をコピーしたいだけなら
@arr1 = @arr2;
でできるし、ディープコピーをしたいならCloneモジュールを薦めるし
>>56 一つ目:
否。クライアントからのリクエストパケットも通信量に含まれるよ。
あと、携帯だと、中継サーバが対象端末用に言語を変換している場合も。
でも基本的なことは
>>56 のでOK。
>>62 >>56 はそんなことは承知と思われ。
どちらにしても送信側のパケット通信料は発生するのだから。
11:3=B
(・∀・)
68 :
60 :2005/12/13(火) 14:50:00 ID:???
例を書いていたらそれはうまく動作するようになりました。 再度出直してきますorz どうにも強引ですが、内部のリファレンスをコピーしてしまっている 例を挙げます。 $hoge=[{'id'=>'65563','count'=>'11'},{'id'=>'87214','count'=>'14'}]; $moge=[{'id'=>'65563','count'=>'32'},{'id'=>'87214','count'=>'28'}]; @$hoge=@$moge; $moge->[0]{'count'}=60; print $hoge->[0]{'count'};
>>68 強引というか、それが普通の挙動で、リファレンスのいいところでもあるのに
ちなみに>60の「多重配列」もリファレンスだからね
use CGI qw/:standard/; my $cgi = new CGI; if(param()){ if (param('save')){ print header(-type => "text/html",-charset =>"x-euc-jp" -cookie => param('test')); }else{ print header(-type => "text/html",-charset =>"x-euc-jp"); } printDump,start_html('test'),start_form, "クッキーにデータを保存する", submit(-name => '保存', -value => 'save'); end_form,end_html; }else{ printheader(-type => "text/html",-charset =>"x-euc-jp"), Dump,start_html('test'),start_form, checkbox(-name => 'test', -value => 'test'),p, submit,end_form,end_html; }
このような簡単なCGIを組んでみました。 親CGIでsubmitを押すと、子のCGIに親のフォームデータが送られますが、 その子CGIでsubmitを押すと、孫CGIには親のフォームデータが引き継がれません。 子CGIで、親CGIのフォームデータをhiddenfiledなどに入れれば良いのですが、 フォームデータが多い場合は少々煩雑になってしまいます。 何かスマートな方法がありましたら、ご教示願えますでしょうか。
ミスがありました。 false print header(-type => "text/html",-charset =>"x-euc-jp" -cookie => param('test')); true print header(-type => "text/html",-charset =>"x-euc-jp", -cookie => param('test')); false submit(-name => '保存', -value => 'save'); true submit(-name => 'save', -value => 'save'); 以上、よろしくお願いします。
75 :
73 :2005/12/14(水) 00:00:59 ID:???
あ。。。ごめんなさいそのURL開くの忘れてましたorz 74さん有難うございます!
>>71-72 #!/usr/local/bin/perl
use CGI qw/:standard Vars/;
my $charset = 'Shift_JIS'; my %param = Vars;
my($cookie, @form);
if ($param{'save'} eq 'save') { # 孫
$cookie = cookie(-name => 'test', -value => 'test');
@form = ('OK');
} elsif (keys %param) { # 子
@form = (
'Cookie に保存',
map(hidden($_, $param{$_}), keys %param),
submit(-name => 'save', -value => 'save'),
);
} else { # 親
my $name = 'a';
@form = (map(checkbox(-name => $name++, -value => $_), 1..5), submit);
}
print header(-charset => $charset, -cookie => $cookie),
start_html(-title => 'test', -encoding => $charset, -lang => 'ja'),
Dump,
start_form, p(@form), end_form,
end_html;
77 :
76 :2005/12/14(水) 00:39:21 ID:???
>>76 おお!早くも神レス大変ありがとうございます。
あまりにもスマート過ぎて、素人な自分には謎の部分(特にVars)が多いのですが、
これから理解して、神コードを取り入れさせていただきます。
Vars はperldocを読んでも今ひとつ理解できなかったのですが、
こんなに便利なものだとは判りませんでした。
繰り返しになりますが、質問に答えていただいてありがとうございました。
openよりもsysopenを使った方が良いという話を聞いたのですが、 ほとんどの本やwebにあるサンプル等はopenを使ってます。 sysopenのメリットはわかるのですが、デメリットとかあるのでしょうか? それと何故、サンプル等はopenの方が多く使われてるのでしょうか?
>>81 話をした人に聞いてみるのがいちばん。
おれは奨めない。以上。
openはパイプとかレイヤーを使うときは便利だし いちいちフラグ用の定数を用意する必要もないから openでできることをやる分には楽だよ。 sysopenじゃないと指定できないフラグの組み合わせが あるからそういうときはsysopen使うけど。
>>82 話した人ってのは、メリットを話した上で勧めたんだろ?
だから、「sysopenのメリットはわかるのですが」と書いてある。
…で、
>>81 は多くがopenの方が使われてるのを疑問に
思ったんじゃないの?
あと、何故勧めないのか書かないと回答にならんよ。
>>81 漏れは
>>83 と同じようにフラグ用の定数用意がめんどう。
パイプ等はあまり使わないから、sysopenでも良いんだけどね。
85 :
73 :2005/12/14(水) 12:37:52 ID:???
>>73 です。何度もすいません。
sort { $b <=> $a }でソートされるのはわかったんですが、
どこに記述すればいいのかわかりません。
21行目に、sort {$b <=> $a} %count と書くと、ソートされた数字のみが表示されてしまいます。
87 :
73 :2005/12/14(水) 13:46:19 ID:???
88 :
nobodyさん :2005/12/14(水) 21:24:43 ID:S7xP2RtY
フォームで入力された文字の中に 全半角英数字・全角日本文字(ひらがな・カタカナ・漢字)以外の文字 が入っているか判定したいのですが、 そのための正規表現を教えてもらえませんか、文字コードはEUCです。
>88 >8にあるサイトが詳しいので良く読むといいよ
90 :
本日@挫折90% :2005/12/14(水) 22:43:42 ID:SzJP4ieY
質問なのですが、本日勉強したのですが、print関数やprintf関数 等勉強したのですが、perlプログラムのサンプルを見たのですが、 まったく桁が違うすごいプログラムでした、このまま本の通りに 覚えていけばいいのか、正直不安になりました、このまま、焦らずに 本書どおりに進めていいのでしょうか? 熟練した方もしいい教材などありましたら、参考におしえてください。
91 :
本日@挫折95% :2005/12/14(水) 22:45:21 ID:SzJP4ieY
↑すいません、日本語おかしくなってしまいますた。不安度+5%;
一日で諦めたり近道探したりするなら向いてないんじゃない? バット二三回振って打てねーよとか言われても誰も相手しないよ
>>90 最初から全てを理解できる人が居たら、それは天才。
他人が書いたperlのソースをスラスラ読めるようになったら上級者。
(ピンキリあるし、神レベルのコードはそれはそれで読むのが難しい。)
プログラミングの勉強と学校の勉強の違うところは 文章(コード)中に知らない文法やら単語がいっぱいでてくるところだろうな。 わからないところはとりあえず飛ばせばOKくらいでやらないと 学校の勉強に慣れてきた人間には正直ツラいと思う。
95 :
nobodyさん :2005/12/15(木) 01:37:31 ID:w2M1wJUg
>>81 openはパイプ文字による外部プログラブが実行可能です。
「ブラウザで入力した情報をformにて送信して、
その情報のファイル名を表示するなんてCGIを作った場合、
入力文字にパイプを混入されるとセキュリティ上危険(入力文字検査すればOK)」
が理由のアドバイスかもね。
my %count; { local *FH; -f $file or die "No such file.\n"; open FH, '<' . $file or die $!; while (<FH>) { ++$count{$_} for 「 (.*?) 」/g } close FH; } print header(-charset => $charset), start_html(-encoding => $charset, -lang => 'ja'), table(Tr([ map td([ $_, $count{$_} ]), sort keys %count]) ), end_html, 文中の単語の数を数えるスクリプトなんですが、 「x回以上出た場合はbgcolorをredにする」という風にしたくて、 if(5<$count{$_}){$bg="orange";}を追加して、 tr部分に{-bgcolor=>$bg}を追加したんですが、上手く変わってくれません。 どなたかご教授お願い致します。
またCGI.pm厨か!
98 :
96 :2005/12/15(木) 08:45:17 ID:???
ほんと何度もすいませんですorz CGI.pmっていうのがそもそも何なのか・・・
for 「 (.*?) 」/g いくらPerlでもこんな自由な書き方できないだろ?
my %count;
{
local *FH;
-f $file or die "No such file.\n";
open FH, '<' . $file or die $!;
while (<FH>) { ++$count{$_} for 「 (.*?) 」/g }
close FH;
}
if(5<$count{$_}){$bg="orange";}
print
header(-charset => $charset),
start_html(-encoding => $charset, -lang => 'ja'),
table(Tr([ map td({-bgcolor=>$bg},[ $_, $count{$_} ]), sort keys %count]) ),
end_html,
こんな感じで書きました。
>>100 for 「 (.*?) 」/gのほうは問題なく動作してます
>>102 while (<FH>) {...}を抜けた直後は$_はundefになってる筈なので、
そこで
if(5<$count{$_}){$bg="orange";}
などとやっても意味がない。
直し方としては、どれか一つでも5を超えたら全部色をかえたいのか
5を超えたやつだけ色を変えたいのかで違ってくるが、説明が不明瞭
なのでなんともいえんな。
104 :
nobodyさん :2005/12/15(木) 13:49:29 ID:tLuO4r1h
$string に以下の#1#の文が入っていたときに $string =~ s/\r//; $string =~ s/\n//; という処理をしたら 出力したときに#2#の結果になります。 1行目は確かに文字列から改行が取り除かれていますが、 3、4行目は変わっていません。 すべてに対して改行を取り除く方法ってありますか? # 1 #################### お願いします おねがいします 本当 おねがいします" ######################## # 2 #################### お願いしますおねがいします 本当 おねがいします ########################
最近ほんと意味不明な質問が増えたな
$string =~ tr/\x0A\x0D//d;
お願いしますおねがいします本当おねがいします
108 :
nobodyさん :2005/12/15(木) 14:01:43 ID:tLuO4r1h
>>106 できました。
ありがとうございます!!!
>>103 できれば5区切りで色を変えたいと思ってます。
10以上黄色、15以上オレンジ、20以上赤みたいな感じです。
お手数ですがお願いします。
丸投げすんなうんこ
>>109 perlをやりたいんじゃなくて、
特定の事だけをやりたいのなら、改造スレへどうぞ。
>111 わかりました。有難うございました。
113 :
nobodyさん :2005/12/15(木) 15:19:56 ID:tLuO4r1h
if ($form{'どのうようにして'} =~ /インターネット/){if ($csv) {$csv_data .= '1,';}} else {if ($csv) {$csv_data .= '0,';}} formから渡された「どのようにして」に”インターネット”というキーワードが入っていた 場合、1というデータをCSVファイルに挿入したいんですが、 どうやら、上の記述に間違いがあるみたいです。 記述ミスありますか?
Shift_JIS使ってるに10000ペリカ
115 :
nobodyさん :2005/12/15(木) 15:26:36 ID:tLuO4r1h
>>114 使ってますねwww
どうすればいいのかな?対処方法知ってたら教えてください
117 :
nobodyさん :2005/12/15(木) 15:34:15 ID:tLuO4r1h
>>116 サンクス。 htmlからフォーム渡すとき
この部分だけ valueを 日本語から 数字に変えて渡したら上手くいったよ。
SHIFT JISややこしいね。
118 :
本日@挫折0% :2005/12/15(木) 18:44:33 ID:3wI62WI7
挫折より帰還しました 今後ともよろしこお願いします。
ここはコーディング初心者スレであって、Perl教室ではない。
そしてここは質問スレであって、今日のPerl日記スレじゃない。
=cut はいはい、ここまでカット
122 :
俺の日記@パールちゃん :2005/12/15(木) 23:41:06 ID:3wI62WI7
以下、俺の日記となります
ここまでコメントな =cut
__END__ 最強
EOF
^Z
127 :
nobodyさん :2005/12/16(金) 05:31:09 ID:nqW99XKP
だめだ。 ヒアドキュメント使うとソースが見づらいorz
#
>>1 に則った質問ほど答えてもらえる可能性がございます。
use strict;
elseifと書いたらエラーが出るのは、嫌がらせかなんかですか?
131 :
cbi-cgi/count/dayx.cgi?gif :2005/12/16(金) 19:52:49 ID:u8eearJF
$ip_check = 1
132 :
カウンター2日目 :2005/12/16(金) 19:58:13 ID:u8eearJF
;上付け忘れた・・ .txtに変換 16<>1000<>2000<>3000<>fri<><>
133 :
nobodyさん :2005/12/16(金) 21:22:32 ID:Nkz0ct/3
リンクページにページ送り機能を追加するんですが、 その際リンクを、順番ではなくランダムで表示するようにしたいんです。 それぞれのページで、重複したリンクが表示されないようにしたいのですが、 具体的にどのようにコーディングすれば良いのでしょうか?
ランダムに配列から取り出した後、その要素をspliceで取り除く
それの繰り返し
136 :
nobodyさん :2005/12/16(金) 21:43:16 ID:Nkz0ct/3
表示するページをランダムに決めて、 それをパラメータとしてURLに含めるといった感じの処理でいいんでしょうか?
ページのナンバーを配列にでも突っ込んでシャッフルして、 それを順番に出力すりゃいいんじゃね? 参考になるかわからんが、こんなんどうよ @array=(); for ($count = 0; $count < 7; $count++) { push(@array,$count); } &shuffle (\@array); sub shuffle { my $array = shift; my $i; for ($i = @$array; --$i;) { my $j = int rand ($i + 1); next if $i == $j; @$array[$i, $j] = @$array[$j, $i]; } }
>>136 分からないのは
・リンクするページを混ぜる(シャッフルする)部分
・どうやってリンクするのか
のどっち?
1.テンプレートなどを利用して全てのページを動的に出力する 2.ページ移動用のスクリプトを用意して、ページ移動用のリンクに全部埋め込む 3.SSIを利用して、リンクの部分を別ファイルで用意する 一定時間ごとに混ぜるのなら3.でもいいけど、 訪問者ごとに違う順番を見せるのなら3.は向かない。 2が一番無難。 って答えでいいかしらん。
>>136 の言いたいことがまだわからないのは俺だけだろうか
142 :
nobodyさん :2005/12/17(土) 21:16:26 ID:6Cij4iqn
ネット上でIDやパスワードなどの登録画面などで登録後に前のページに 戻ったりすると「有効期限切れ・・・・」という画面がでますが そういう仕組みってどうすればいいんですか? perlからすこしそれた質問かもしれませんが教えてもらえませんか?
Expire:とかExpireとか
画像をアップロードしたいのですが アップロードされたファイルの、保存される前のファイル名の取得方法をおしえてください。 おねがいします。
フォームからmultipart/form-dataでデータ飛ばして 観察してみろと。
それを聞いてるのでは?・・・
147 :
nobodyさん :2005/12/18(日) 03:17:23 ID:3ossMEQR
ページを戻ると 警告 : ページの有効期限切れ が出ます。 少し調べてみたところ、入力フォームがあるとこうなるらしいですね。 入力フォームを残したまま、エラーを出させないようにすることは出来ないでしょうか? よろしくお願いします。
148 :
nobodyさん :2005/12/18(日) 05:12:35 ID:7vISx30W
perlで,外部サイトへのリンク切れは どのようにしてチェックできますか? よろしくお願いします。
外部サイトってなんだよ 何がやりたいのか意味不明
152 :
150 :2005/12/18(日) 18:22:15 ID:???
意味不明でごめんなさい。 1万件のリンクをリンク切れかどうかチェックするスクリプトを作りたかったのですが、 何とか自力で作ることができました。 解決です。m(_ _)mぺこり
3時間かからないで作ったのかヨ。って、別人だろ
んなの5分もいらないだろ
>>148-149 無理なのか。期限切れにならないサイトもあったから操作可能なのかと。
サンクス。
156 :
nobodyさん :2005/12/18(日) 23:12:38 ID:7vISx30W
えくすぱいあ
以上。
>>155 文も読めないやつはマズは国語から学べよチンカスが
ほかいけや
素朴な疑問。 multipart/form-dataのときにもexpireヘッダって効いたっけ? 前にテストしたとき効かなかった(というよりはキャッシュのセキュリティで弾かれたっぽい)記憶があるんだけど?
プロクシオミトロンが入ってたら無効なんだけどね。信用しすぎはイクナイ
「情報を再送信しないとページを更新できません」 という警告はブラウザの機能だから、サーバ側では操作できないと思うが。 これとは違うのだろうか。
161 :
nobodyさん :2005/12/19(月) 01:57:53 ID:mSKnbNI+
基本的な質問で恐れ入ります。 rand関数についての質問ですが $i = int(rand(100)); $i には、0 〜 99 の乱数がセットされる と、とあるサイトに説明されていたのですが、この例の場合100が セットされることはあり得るんでしょうか? int関数は小数部分を切り捨てて整数化するので100を返す場合は100.000… 以外ないと思うので確率的に考えて自分で実際にプログラム作って試して調べるのは とてもじゃないですが無理だと思いますので、どなたか教えてください。
ありません。 perldocにあった気がしたけどURL忘れた
164 :
162 :2005/12/19(月) 10:59:59 ID:???
>>163 有り難うございました!!
乱数を使ってて、ふと気になったもので。
簡単に調べられるじゃん。 for (1 .. 1000000){ 100 <= rand(100) and print "100 Over.\n"; }
( ゚д゚)ポカーン
>>165 それじゃ証明できんだろ
というかrand(EXP)で0からEXP未満までの数をかえすと説明されてるし
168 :
nobodyさん :2005/12/19(月) 15:14:31 ID:nE/lruN5
質問です。 英語のフォームページを作っています。 htmlの中で <html lang="en">と <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> として英語用にしています。 フォーム自体はきちんと動くのですが、届いたメールのタイトル(件名)が文字化けします。 「英語ページよりお問い合せ」が「英語ペ?[ジよりお問い??ケ」になります。 英語ペ\ージよりお問い\合せとか英語\ペ\ー\ジよりお問\い\合\せなど試してみたのですが、うまくいきません。 jcode.plはcgiの中に読み込んでいますが、ページの内容が英語しかない場合は日本語を完全には使えないのでしょうか?
170 :
168 :2005/12/19(月) 16:02:23 ID:???
171 :
nobodyさん :2005/12/19(月) 17:13:11 ID:mSKnbNI+
rand は 0〜99.99... まで 小数点以下がどれくらい続くかは知らない
え?
み?
り?
175 :
nobodyさん :2005/12/19(月) 22:15:36 ID:M/zhZkxT
Perl暦数ヶ月の初心者です。 頑張ればPerl/CGIで簡単な掲示板を作れるかも、という程度でしょうか。 現在、HTML::Templateを使ってコーディングしています。 テンプレートファイル内から TMPL_VAR でパラメータを渡す時、 $template->param( 'PARAM_1' => $var { 'PARAM_1' } , 'PARAM_2' => $var { 'PARAM_2' } , 'PARAM_3' => $var { 'PARAM_3' } , ); というようにやるところを、 出来るだけ動的に行いたいと思っています。 テンプレートファイル内のパラメータ PARAM_XX に対し、 ハッシュ $var { 'PARAM_1' } の値を渡せるようにしたいのですが、 どのようにコーディングすれば良いでしょうか。 自分なりに、環境変数一覧を書き出すプログラムを参考にして foreach my $key ( keys %var ) { $template->param ( $key => $var { $key } ) ; } と書いてみたのですが、値が渡された様子はありませんでした。
176 :
175 :2005/12/19(月) 22:25:36 ID:???
失礼。 誤: ハッシュ $var { 'PARAM_1' } の値を渡せるようにしたいのですが、 正: ハッシュ $var { 'PARAM_XX' } の値を渡せるようにしたいのですが、 それと、Perlのバージョンは5です。
それでわたるはずだが。思い違いじゃない? % perl -e 'use HTML::Template; $t = HTML::Template->new(scalarref => \ "A=<TMPL_VAR NAME=A>\nB=<TMPL_VAR NAME=B>\n"); %h=(A=>"foo", B=>"bar"); foreach $k(keys %h){$t->param($k=>$h{$k});} print $t->output;' A=foo B=bar
$template->param(map +($_, $var{$_}), map sprintf(qq|PARAM_%d|,$_), (0..XX)); (@_@)
おっかしーなー…… (10分後) 変数名違ぇじゃん… orz ご迷惑おかけしました。 俺の半日はなんだったんだ。
180 :
nobodyさん :2005/12/19(月) 23:30:59 ID:mSKnbNI+
ループでぶん回せばいいだけじゃん
m9(^Д^) プギャー
182 :
nobodyさん :2005/12/21(水) 09:34:15 ID:m1/a3jED
リンク元を 取り出すためにはどうすればいいでしょうか?
183 :
nobodyさん :2005/12/21(水) 09:53:57 ID:m1/a3jED
$ENV{'HTTP_REFERER'} を使えばいいってことは分かるんだけど 流れとして どっかリンク元→ a.html → b.cgi ってかんじでaのフォームで変数をb.cgiに渡すってかんじなんだけど b.cgiで$ENV{'HTTP_REFERER'}を使うと、a.htmlがリンク元として 表示されてしまいます。 どっかリンク元の環境変数を得るにはどうすればいいですか?
>>183 a.htmlをa.cgiにしてそこで取得する
どっかリンク元→ a.cgi → b.cgi
またはa.htmlでJavascript使って渡す
185 :
nobodyさん :2005/12/21(水) 12:44:51 ID:m1/a3jED
>>184 javascriptでも出来るんですか!?
186 :
nobodyさん :2005/12/21(水) 14:50:11 ID:kTJQiyq+
hogehoge配下の.txtファイルであれば全てpermissionを664にすると言うプログラムを作りたいと思います。 opendir DIR, "hogehoge" || die "cannot open"; @entry = readdir DIR; foreach(@entry){ opendir DIR, "$_"; @entry = readdir DIR; if($_ =~ /.txt\z/){ $changemode = chmod 0664, "$_"; } } と書いたのですが、 hogehogeの中にディレクトリがあった場合は。そのディレクトリの配下にあるディレクトリやファイルを更新しません。 hogehoge配下にあるディレクトリやファイル全てを読み込むようなプログラムを作るのにはどのようにしたらよいでしょうか?
>>186 楽してモジュール使えば?File::Findとか。
>>187-188 ありがd
結局Find使わずにやりました。
てか、作ってからFindに気がついたorz
質問させてください。 語尾が.htmlで終わるものを「処理」を行っているのですが、 .htmlだけでなく、.htm .jpg .gif も「処理」対象にしたい場合は どのような正規表現を使ったらよいですか? if($file =~ /.html\z/){ 処理 }
if ($file =~ /\.(html?|jpg|gif)) { foo(); }
192 :
nobodyさん :2005/12/21(水) 19:31:01 ID:HAcTfIEX
ある本にperl5.8以降では、\p{Han}+ で漢字に一致すると 書いてるので、プログラムに if($abc=~/\p{Han}/){ を記述しているのですが漢字に一致しません。 $abcには漢字が含まれているのですが・・・ 一致させるには、ほかに記述すべきことがあるんでしょうか?
>191 つ/
>>192 decodeしてる? $abcがEUCのままなんて事は無いよな?
196 :
nobodyさん :2005/12/21(水) 21:37:38 ID:ib12VQrv
JavaScript の replace() はリファラそのままスルーしたとおもった
198 :
192 :2005/12/21(水) 21:45:01 ID:HAcTfIEX
>>195 何もしてないのでeucそのまんまです。
「use encoding 'euc-jp';のように、
スクリプトに使っている文字コードを指定することで
\p{Han}+でEUCに正しく一致する」とだけ本には書いてあるので、
プログラムにuse encoding 'euc-jp'の一行を加えましたが、
一致しませんでした。
多分ものすごく基本的なことが理解できてないのだと思います。
もしかしてeucをUnicodeに変換しないとダメということなんでしょうか?
もしそうならその仕方を教えてもらえないでしょうか?
>>192 初めて知った機能だよ。
use encoding qw(euc-jp);
my $str = "漢字";
$str =~ /\p{Han}/ and print "true";
一応こんなでも通るけど。
>>198 shift-jisで書いちゃってるとか?
201 :
192 :2005/12/22(木) 00:17:58 ID:l+S0SPkv
というか use encoding 'euc-jp'のところでエラーが発生してます error.log見てわかりました。 Wide character in print at ....ってなってるんですが・・・・ なんでなんかな。perlは5.87なのにapche2.0やIE6では駄目とか?
204 :
nobodyさん :2005/12/22(木) 10:49:59 ID:iSEjIkIt
ファイル郡から拡張子だけを抜き出すにはどのようにしたらよいですか? 例えば start.exe readme.txt stop.exe index.html と並んでいたら、 .exe .txt .exe .html のように抜き出したいのですが
@filenames = ("hoge.txt", "foo.bar.avi", "baz.jpg"); foreach $filename (@filenames) { push @extensions, (split(/\./, $filename))[-1]; } foreach $extension (@extensions) { print $extension, "\n"; }
>>204 print join "\n", map /(\.[^.]+)\z/, qw(start.exe readme.txt stop.exe index.html);
207 :
204 :2005/12/22(木) 13:00:30 ID:???
208 :
204 :2005/12/22(木) 13:05:37 ID:iSEjIkIt
204-205を参考に 拡張子が重複する(フォルダは無視)場合は表示しないようにするプログラムを作ってたんだけど、 うまくいきません 例えば start.exe hogehoge/ readme.txt stop.exe index.html readme.html と並んでいたら、 .exe .txt .html のように抜き出したいのですけど、、 センスないのかなorz・・・
>208 日記はチラシの裏にでも書いてろ
このスレって実績ある?
あるよ。
>>208 Perlをなめてんのか?
連想配列にでも突っ込めよ
213 :
204 :2005/12/22(木) 14:43:03 ID:iSEjIkIt
出来ました
if(-f $file){
push @extensions, (split(/\./, $file))[-1];
$fext = (split(/\./, $file))[-1];
}
foreach $extension (@extensions) {
$ext{$extension} = $ext{$extension} +1;
}
($key,$value) = each %ext;
while(($key,$value) = each(%ext)){
print $key, " - ", $value, "\n";
}
>>212 のアドバイスがききました
ありがとうございました
214 :
nobodyさん :2005/12/22(木) 16:51:29 ID:9N6o95FW
CGI::Application を使ったモジュール内でエラーが起こった時に、 出力を CGI::Carp qw(fatalsToBrowser) のようにするには どうすればよいんでせう?
こういうのは?つCGI::Application::Plugin::DebugScreen
216 :
214 :2005/12/22(木) 17:14:18 ID:???
>>215 早速ありがとう!
dependecies にひっかかってなかなかインストールできなかったけど
無理やり動かせた。
開発効率かなりあがりそうだ。
でも、この画面ユーザには見せたくないね。
やっぱエラー処理はちゃんと書かないとダメそうだ。
>>214 CGI::Applicationのpod見れ
読んだんなら引用すればいいのに(*´・д・)(・д・`*)ネー
m9(^Д^) ・・・
( ^ω^)・・・
encodingの話ですが、 use encodings "cp932"; を指定しているとき、 URLエンコードされたものが、正常にデコード できません。 #!/usr/bin/perl use strict; use encoding "cp932"; #ここをコメントすれば上手くいく binmode STDERR, ":encoding(cp932)"; print "Content-Type: text/html; charset=Shift_JIS\r\n\r\n"; my $value; $value = '%95%5C%8E%A6'; #表示 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print "しふとじす\n"; print $value; 肝心の$valueが、ちゃんと"表示"に戻りません。 use encodingsの指定をやめると正常に動きます。 原因は何となくわかる (内部はutf-8で処理しているから?) のですが、対処方法がわかりません。 ここ嫁 でも結構ですので、教えていただけませんか?
>>221 encoding、PerlIO::encoding、perlunicode を見ろ。
223 :
221 :2005/12/24(土) 23:34:41 ID:???
書き忘れました。 やりたいことは、ソースコードをShift_Jis(cp932)で統一したいのと、 実際に、CGI.pmを使った場合でも、GET、POSTされた Shift_Jisのデータ、 正確には、URLエンコードされたもの、が正常に取得できないので、 これをどうにかしたい、ということです。
>>221 これだけだと不親切だな。
>>8 にある Unicode 関連のところも読め。
225 :
nobodyさん :2005/12/25(日) 10:06:00 ID:MhkrUB/B
環境変数で(環境変数でなくてもいいけど)httpであるのか、httpsであるのか見分ける関数ってありますか?
226 :
nobodyさん :2005/12/25(日) 10:50:26 ID:sTNGkhi5
https で接続されたときには環境変数 HTTPS に値がセットされると思った
227 :
221 :2005/12/25(日) 12:10:36 ID:???
>>222 ,224
ありがとうございます。podの方はまだ少ししか読んでませんが、
>>8 の方は読んでみました。
というか、以前から読んでいましたが、理解できていなかった...
#!/usr/bin/perl
use strict;
use Encode;
use encoding "cp932";
binmode STDERR, ":encoding(cp932)";
my $wc = '%95%5C%8E%A6'; #表示
#ただのアスキーコードだけど、utf8フラグがたつ
my $nwc = Encode::encode('cp932',$wc);
#1Byte単位でpackするために、utf8フラグを落とす
$nwc =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#utf8フラグの立っていない$nwcに対してpackする。1Byte単位で扱える
#$nwcには、cp932の生バイナリが入る
$wc = Encode::decode('cp932', $nwc);
#$nwcのままでは表示できないので、再びutf8フラグを付ける。
print $wc;
#$wcはutf8フラグが立っているので、STDOUT出力時に
#Encode::encode('cp932',$wc)が内部的には動いている
こんな理解で大体OKでしょうか?
だけど、ずいぶんと回りくどいことしていると思います。
> だけど、ずいぶんと回りくどいことしていると思います。 よく分かってるじゃないか。 encoding は一見お手軽に見えるけど、使い勝手悪いよ。 日本語は全て外部ファイルに追い出すのが遥かに楽。
229 :
221 :2005/12/25(日) 18:24:14 ID:???
>>228 実はencodingをはじめて知ったとき、『これは使える』と思ったのですが、
URLデコードのところで躓いて、導入をあきらめていました。
そのときは、ソースに日本語べた書きでしたが、やっぱり外部ファイルに分離
するのがいいですね。
encodingを使えば、=~(マッチ演算)などで、半角カナなど(何も考えず)上手く処理できる?
print "本能"; などが文法エラーにならないなど、メリットはありますが...
逆に使えなくなるモジュール等を考えると、デメリット(副作用)の方が多いような。
あと、何かとデバックのために Data::Dumperを使って表示するのですが、
Dumperを使って日本語(の入った変数)を表示した場合、Perl内部コードがそのまま
表示されるので、不便といえば不便ですな。
>>229 必要な所にno encoding入れれば、それほど面倒でもなくなるよ。
それも結構、落とし穴があったりするけど。
>>230 (my $result = $comment) =~ s/ (以下略
それと正規表現も修正。
232 :
231 :2005/12/25(日) 20:09:43 ID:???
あっと、
>>229 宛てのは勘違いしてました。
スマソ。
233 :
230 :2005/12/26(月) 00:25:11 ID:???
HTML::Templateを使っています。 TMPL_VAR で、改行コードを含んだ文字列を置換するとき 改行コードを<br>や<br/>に変換する便利な方法は無いのでしょうか。 要求される仕様上、<pre>やスタイルシートなど、<br>以外で改行させる方法は不可とします。 現状: 改行コードが自動的に置換されないので、ブラウザ上では改行されて見えない やってみた方法: (1) 自前で改行コードを<br>に変換、HTML::Templateのサニタイジング機能を使う → <br>というタグが見えてしまう (2) 自前で改行コードを<br>に変換、HTML::Templateのサニタイジング機能を使わない → 正常に改行されるが、セキュリティ上かなりやばい (3) 自前でサニタイジング、HTML::Templateのサニタイジング機能を使わない → とりあえず問題なく動くが面倒&重い。他の方法はないものか? Perlのバージョンは5。 HTML::Templateのバージョンは不明。(申し訳ない、比較的新しいとは聞いた
235 :
230 :2005/12/26(月) 01:19:00 ID:???
試行錯誤した結果、正規表現を (s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$%#]+) にしたら上手くいきました。 変更点は (1) ()で挟んだ (2) 後ろの方の$と%の間の,を無くした です。 何でこうなるのかまだ理解してないので自信ないのですが これであってますよね?
>>234 出力する文字列を配列にしてTMPL_LOOPで回すのは無し?
サニタイズぐらい自分でやれよって気はする。
>>235 括弧で挟むのは、置換するところで$1として使ってるから。
カンマは有っても動きそうだけど。
237 :
234 :2005/12/26(月) 02:10:56 ID:???
>>236 まあ、サニタイジングくらい自分でやるですよ。
これくらいHTML::Templateの機能にあっても良さそうなもんなんですけどね。
238 :
230 :2005/12/26(月) 02:18:17 ID:???
あれ?今やったらカンマ有りでもできました。 できなかったのは他に原因があったのかな・・・。 何はともあれありがとうございました。
>>237 Template Toolkitならhtml_line_breakというフィルタがあるので
[% foo | html | html_line_break %]
てな感じでいけるんだけどね。
use strict;
use Template;
my $t = Template->new();
my $input = <<INPUT;
[% foo | html | html_line_break %]
INPUT
my %vars = (
foo => "foo<>\nbar\n&hoge\n",
);
$t->process(\$input, \%vars);
240 :
nobodyさん :2005/12/26(月) 19:53:21 ID:w9go55d/
Perlは初心者なんだが、開発環境がちょっと不足気味だな。 俺は、VC++で自分でつくったやつ使ってるよ。 上半分はエディタで、「実行」をおすと、下半分のブラウザに実行結果がでてくれるんだよ。 だれか、ほしいやついる?いるなら、Vectorにでもうpするけど。
いらん
いらんいらん
いんらん
いんりん
エディタが限定されるってのが問題じゃないか、と
今、CGI::ReadParse を使って test.cgi?name=XXX といったようにGETでデータを受けているんですが、 nameの部分は変わることがないので、これを test.cgi?XXX とゆふうに使えるようにしたいんですが どうすればいいでしょうか?
nameが不変ならReadParseしなくてもQUERY_STRINGをそのまま使ってしまってもいいんじゃないか
$ENV{'QUERY_STRING'} ですね できました!ありがとうございました!!
文字列にソが含まれている時に「含まれています」と表示させてたいんですが my $so='ソ\'; if(/\Qソ\E/){ print "含まれています。"; } これを実行してもソがひっかかりません。 どうしてですか?
250 :
249 :2005/12/27(火) 14:36:55 ID:???
×表示させてたいんですが ○表示させたいんですが すいません。ミスりました。
252 :
249 :2005/12/27(火) 15:10:51 ID:???
釣られるやつ居ねぇか。 \x83\x5cだよな。
単純なマッチならindex使えよ
indexより正規表現の方が速いよ
うんにゃ。index()の方が数段速い。
case by case
257 :
nobodyさん :2005/12/28(水) 01:30:43 ID:rgfSZuvi
普通にindexの方が早いんじゃねーの?
単純な?正規表現は、indexと同じアルゴリズム使ってコンパイルするそうな。
そって
>>256
orz そって → よって
はいはいワロスワロス。
ベンチ取ってから言えよ
少なくとも
>>249 のケースでは正規表現の方が速い
3倍ほどな
せっかくベンチとったんなら結果晒しキボン
#!/usr/bin/perl use Benchmark; $buf = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; timethese(10000000, { 1 => sub { if($buf =~ /JKL/){} }, 2 => sub { if(index($buf, 'JKL')){} }, }); ---------------------------------------------------------------------- Benchmark: timing 10000000 iterations of 1, 2... 1: 5 wallclock secs ( 4.53 usr + 0.01 sys = 4.55 CPU) @ 2199736.03/s (n=10000000) 2: 3 wallclock secs ( 1.97 usr + 0.03 sys = 2.00 CPU) @ 4997501.25/s (n=10000000)
>>263 その結果だと261の言ってることとは反対にindexの方が倍以上速いな。
やっぱり index の方が速いですね。3倍ほど…。
>>254 や
>>261 は同じ人ですか?
あまり関係無いですが、if(index($buf, 'JKL')){} なんて書くのはバグの元ですよ
ベンチの為ならこれで充分だろう・・・神経質なヤツだな
267 :
265 :2005/12/28(水) 10:53:48 ID:???
ベンチとしてどうか、っていうと普通に駄目です。 index と正規表現の速さの違いを比べるなら支障は無いので あまり関係無いと書いたんですが、異なる機構を比較してるのは事実ですし、 やはり目的が何であれベンチとして駄目なものは駄目、と書いた方が良かったですね。
思いっきり釣られた…orz
270 :
253 :2005/12/28(水) 11:40:27 ID:???
こんなに議論してたんかよ。。 おれの意図としては速さ以前に、簡単な正規表現を正しく書けないようなら index使えと言うほうに比重を置いたつもりだったんだが。
272 :
nobodyさん :2005/12/28(水) 12:33:32 ID:VO6oi9GX
>271 スレ (´∀`( ´∀`) チガイ
>>274 間に合わなかったようだ
彼は上級者スレに逝ってしまった
>>274 うは、すっげぇ、ありがとう
マルチポストはしないほうがいいよね?
277 :
nobodyさん :2005/12/28(水) 13:10:29 ID:VO6oi9GX
誘導されてきました。 って一言書いておけばいいと思う。
278 :
nobodyさん :2005/12/28(水) 13:14:22 ID:RY3kh/X5
>>277 ありがとう。あなた達、本当に人が出来ているね。
279 :
nobodyさん :2005/12/28(水) 21:13:55 ID:FTSvjaED
eval "require $self->{App}; 1;"; では大丈夫だけど、 eval { require $self->{App}; 1; }; では出来ないのってなんでですか?
仕様
281 :
nobodyさん :2005/12/29(木) 01:45:17 ID:fGeDbioe
んと、 <うにゃ> <うにゃ> にたいして、<と>に挟まれた部分すべて(この場合3カ所)に対して処理したいのですが、どうすればいいんですか? 最短でも最長でもなく、すべてにマッチさせたいのです。
>>281 print join('/', /(?<=[<>])([^<>]*)(?=[<>])/g), "\n" for qw(
a<b>c<d>e
a>b<c>d<e
a<b<c<d<e
a>b>c>d>e
);
284 :
nobodyさん :2005/12/29(木) 08:24:52 ID:fGeDbioe
>>282 舌足らずでした。すみません。
>>281 は
<はげ> <ほげ>
に対して
はげ
はげ> <ほげ
ほげ
をマッチさせたいのです。
最近perl弄り始めたばかりなのだけど、use strictって積極的に覚えて使った方がいい? あとみんな使ってるもの? 普通にちょっと弄って使ってる程度の人なら使わなくてもいいものかな。 今までは情報としてへ〜使った方が良いんだぐらいに考えてたんだけど、 cgi改造してたらこういうときに便利なのかなって初めて思ったので質問してみる。
>>286 規模にもよるけど、変数のスコープでバグ出すことはなくなるので使う。
ただ、改造にはあまり有用でない。(元がstrictで作られているならともかく)
うんち うんち しっこ うんち しっこ みたいなテキストを、 うんち*3 しっこ*2 とゆうふうにカウントしたいんですが、どうすればいいかわかりません。 切り出した文字列を変数にしてカウントアップすればいいんでしょうか? 方法があればおしえてください。
290 :
nobodyさん :2005/12/29(木) 13:11:47 ID:6Q9kRgBG
foreach (@obutsulist){ $obutsu{$_}++; } これでおけだけど、コレからは“例”にも気を付けた方がいいかと思う。
>>287 なるほど。
こなれた人が1から組んでく時には有効って感じで考えるぐらいでよさげだね。
こまめに動作確認したり、規模が大きくなければ特に問題なそうだ。
サンクス。
汚物リストワロタ
>>291 そのへんの判断はもちろん自由だけれど、Perl を始めたばかりということなら何も考えずに use strict と use warnings の使用をおすすめしておく。
295 :
294 :2005/12/29(木) 22:58:10 ID:???
これらを使わずに書いたプログラムに後から付け加えるという使い方には向いてないので、改造などにはもちろん向かない。 と一応補足。
use strictで無い屑スクリプトは改造するに値しない。
そうでもない
K●NTとか・・・
KE●Tとか
KENTがいかに優れたコーディングをしてるからって、
妬み丸出しのレスはカッコ悪いぞ
>>298-299 よ
>>300 今後の参考にしたいと思いますので、
優れた点をご享受いただけないでしょうか?
KENTで育ち漠然と教科書にしていると俺みたいな腐ったPerl書きになるから注意な! 動けばイイや程度で書いてるとソースが汚いし無駄ばかり 挙げ句に処理も遅く回りくどいことをして回りからはバカにされる 俺のポジションはアイデアの参照スクリプトだけで他の奴が清書する 情けないポジション「抜けようか?」と言うと、それはマジに困ると言うから 何か晒し者のように顔色を伺いながらメンバーに居る感じである。 スキルのチョイとある新参の中堅に笑われて不用みたいに言われ続けハゥゥ
305 :
nobodyさん :2005/12/31(土) 00:50:18 ID:LK7Aj/aS
失礼します。 ------------------ #[0]は一意なid my @a = ('aioue', 'sdfgsdf', 100, 'dsfhsf', 2); my @b = ('noriri', 'sdfgsdf', 100, 'dsfhsf', 2); my @c = ('nanndemoi-', 'sdfgsdf', 100, 'dsfhsf', 2); my @arrr; push @arrr, (\@a, \@b, \@c); ------------------ 上記の@arrrのような二次元配列から、 例えば配列の頭に「noriri」が格納されている行を取り出したい場合、 どのようにして該当する行を求めるのが好ましいでしょうか。 ベタベタに考えると ------------------ my $stmp = 'noriri'; my $pt; foreach (@arrr) { if ($${$_}[0] eq $stmp) { $pt = $_; } } ------------------ という感じになってしまうのですが… もっと効率のいい方法は、ありますでしょうか? ご教授お願いしますm(_ _)m
>>305 [0] が一意である事が保証されるなら最初からハッシュで持てばいい。
もしくはそのように加工後、$arrr{$stmp} のようにアクセス。
順序が必要なら順序のデータを持たせればいい。
my %arrr = (
aioue => [ 0, 'sdfgsdf', 100, 'dsfhsf', 2 ],
noriri => [ 1, 'sdfgsdf', 100, 'dsfhsf', 2 ],
'nanndemoi-' => [ 2, 'sdfgsdf', 100, 'dsfhsf', 2 ],
);
これらの前処理に問題があるなら素直に君が書いたように処理。
>>306 ありがとうございます。
とりあえず構造改革できるかどうかやってみます…
>>307 「列を検索して行を特定する」ことが目的なら、行と列の置き方が逆の気がする。
マスターキーが決まってるならもちろんハッシュを利用するけど。
my @a = ('aioue', 'noriri', 'nanndemoi-');
my @b = ('sdfgsdf', 'sdfgsdf', 'sdfgsdf');
my @c = (100, 100, 100);
my @d = (2, 2, 2);
構造改革ワロスw 構造を変更しない、もしくは前処理をしないのが前提なら高階関数の方が 好みかなぁ。 use List::Util qw(first); my $pt = first { $_->[0] eq 'noriri' } @arrr;
> Caught exception "Can't locate object method "insert" via package > "Class::DBI::Sweet" at /usr/share/perl5/Class/DBI/Sweet.pm line 630." これって、どうやったら解決できる?
英語読めてるか?
312 :
nobodyさん :2006/01/03(火) 15:22:09 ID:lh2VfF1u
$Defs = [ { "title"=>"Config A", "name"=>"A", "type"=>"TEXT", "value"=>"352" }, { "title"=>"Config B", "name"=>"B", "type"=>"TEXT", "value"=>"" }, { "title"=>"Config C", "name"=>"C", "type"=>"TEXT", "value"=>"" }, ]; 連想配列の配列を作ってみたのですが、これでlength($Defs)とすると16が帰ってきます。 これをループで処理するために3を得たいのですが、どうすればいいのでしょうか?
>>312 foreach my $it (@$Defs) {
# 各要素は $it でアクセス
}
もしくは、
for (my $i = 0 ; $i < @$Defs ; ++$i) {
# 各要素は $Defs->[$i] でアクセス
}
314 :
nobodyさん :2006/01/03(火) 18:10:35 ID:6LWi5P1T
時刻表示を作ってみたんですが。 どうみてもソースが汚いです。 use strict;なスクリプトに修正してもらえませんか? サブルーチン初めてなので間違いが多いと思うのでアドバイスお願いします #!/usr/bin/perl my $time = &Get_Time; print "content-type: text/html\n\n"; print "$time\n"; exit; sub Get_Time{ my $times = time(); my($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times); my @week = ('日','月','火','水','木','金','土'); my $time = sprintf("%04d\/%02d\/%02d\(%s\)%s%02d\:%02d:%02d",$year+1900,my $mon+1,$mday,$week[$wday],my $aft,$hour,$min,$sec); return $time; }
なってるじゃん
>>314 別に悪くないと思うが。そこからどうシェイプするかは個人のスタイルの問題だし。
317 :
314 :2006/01/03(火) 18:37:03 ID:???
>>315 このままで良いという事ですか?
( ゚Д゚ )
それじゃあもうひとつだけお願いします。
サンプルから引き抜いた部分が多いので、$monと$aftの意味が良く分からないのですが、
表示に影響もないみたいなので、削除しても大丈夫なんでしょうか?
318 :
nobodyさん :2006/01/03(火) 18:40:34 ID:QwphIqM2
test
>>316 あ、ちょっと待った。機能的な部分まで見てなかったw
$monは$monthのつもりで間違ってるんだろうし(今は0+1月だから問題ないように見えるが)
$aftは何したいのか良くわからんし。自分で流れをよく追ってごらん。
320 :
314 :2006/01/03(火) 18:48:13 ID:???
>>319 見逃してた訳ではなかったんですが、おかげさまで理解できました。
ありがとうございました。
他にも見つかったらレスお願いします
>>314 つかコピペするんじゃなくて、サンプル見ながら「理解しつつ」自分で打ち込まなきゃ身につかないよ。
322 :
312 :2006/01/03(火) 21:22:10 ID:lh2VfF1u
>>313 > foreach my $it (@$Defs) {
> # 各要素は $it でアクセス
> }
これが美しいですね。 ありがとうございました!
ある文書内に特定のフォーマットにて書かれた文章を取り出す方法を探しています。 例えば sample.txt内に aaa=000 bbb=111 ccc=222 aaa=333 bbb=444 ccc=555 というフォーマットで10個くらい書かれている中から 例えば aaa=000 bbb=111 ccc=222 なら$aaaに000を格納したいんですが、どうすればいいでしょうか? 教えてください。お願いします。
>>323 誘導するほどの話でもないなー。
1.「=」でsplit使って分ける(仮に$leftと$right)
2.$right を ${$left} に代入する
コーディングについてはPerlの本一冊読めば理解できる話だからしない。
たいていの場合は$aaaに入れるより適当なハッシュを用意して $hash{aaa}に入れた方がいいと思うけどな。
327 :
305 :2006/01/04(水) 03:10:14 ID:???
>>308-309 いつの間にやらレスが…
すみません、ありがとうございました。
質問したソースのcgiは、とりあえず意地でも正月休み中に動かしたかったので、突貫で作ってしまいました。。
ttp://homepage2.nifty.com/bel_s/webtag/ ソースというかソースはもちろん構造もかなりぐちゃぐちゃです。。
突っ込みどころだらけというかめちゃくちゃだと思いますが何かありましたら突っ込みお願いします。。直すこと前提でとりあえず動かしました。
結局構造改革は大変そうだったのでやめました。自前で作ったfile.pmから作り直しになってしまいそうだったので…。
>>308 全然思いつきもしませんでした。。
使い方によってはだいぶ効率がかわりそうですね。。
verupにむけて参考にさせていただきますm(_ _)m
>>309 チラシの裏ですが今回コンセプトとして「勉強」「設置が楽/場所を選ばない」ってのがありまして、
ライブラリは全部自分で作ってひとつに纏めてしまいました。
328 :
305 :2006/01/04(水) 03:14:20 ID:???
>>327 すみません、「突っ込んでね」ではなく、
暇な方や人のソース眺めるのが好きな方いましたら、気が向いたらお願いします程度の意味です。
なんか変な暗黙の行間ができちゃったような気がするので補足。
今日仕事なのになにやってんだおれー
>>323 sub read_ini {
open (INI, shift);
flock (INI, 1);
my @ini = <INI>;
close INI;
my %INI;
foreach (@ini) {
chomp $_;
if ($_ =~ /^\#|^[(.+)]$|^\/\/|^\[(.+)\]$/ || $_ eq "" || index ($_, "=") < 0) {
next;
}
my $key = substr ($_, 0, index ($_, "="));
my $value = substr ($_, index ($_, "=") + 1, length ($_));
if ($key ne "") {
$INI{"$key"} = $value;
}
}
return %INI;
}
%INI = &read_ini ("test.ini");
foreach (sort keys %INI) {
print $_ . "\n " . $INI{"$_"} . "\n";
}
こんなのダメっすか
インデントが酷くなったorz sub read_ini { open (INI, shift); flock (INI, 1); my @ini = <INI>; close INI; my %INI; foreach (@ini) { chomp $_; if ($_ =~ /^\#|^[(.+)]$|^\/\/|^\[(.+)\]$/ || $_ eq "" || index ($_, "=") < 0) { next; } my $key = substr ($_, 0, index ($_, "=")); my $value = substr ($_, index ($_, "=") + 1, length ($_)); if ($key ne "") { $INI{"$key"} = $value; } } return %INI; } %INI = &read_ini ("test.ini"); foreach (sort keys %INI) { print $_ . "\n " . $INI{"$_"} . "\n"; }
split 使えばいいのに。
このスレは回答者も初心者なんですね
なんか YukiWiki にそれっぽいルーチンがあったぞ。 sub get_info { my ($page, $key) = @_; my %info = map { split(/=/, $_, 2) } split(/\n/, $infobase{$page}); return $info{$key}; }
>>333 今時ヒントなんて使ってるやつはばかです。
>>324-325 で答えが出たと思ってた
use FileHandle;
use Data::Dumper;
my $fh = FileHandle->new("sample.txt") or die;
flock($fh, 1);
chomp(my @lines = $fh->getlines());
$fh->close();
my @ini_set;
my $temp = {};
foreach my $line (@lines, ''){
if ($line){
my ($key, $value) = split(/=/, $line, 2);
$temp->{$key} ||= $value;
} else {
keys(%{$temp}) and push(@ini_set, $temp);
$temp = {};
}
}
print Dumper(\@ini_set);
こんな感じでどうなん。
#!/usr/local/bin/perl -w
use strict;
my $format = qr/^\s*([^=]+)\s*=\s*(.*)$/;
my $file = $ARGV[0] || './sample.txt';
-f $file || die "No such file.\n";
open FH, '<' . $file or die $!;
# local $/ = ''; # 段落モード
# while (<FH>) {
# my %data = /$format/gm; # 空行が Record Separator
# print map("$_:[$data{$_}]\n", sort keys %data), "---------\n";
# }
while (<FH>) {
/$format/ || next; # フォーマットに合わない行が Record Separator
my %data;
do { $data{$1} = $2 } while <FH> =~ //; # 改行が Field Separator
print map("$_:[$data{$_}]\n", sort keys %data), "---------\n";
}
__END__
参考:
http://search.cpan.org/modlist/Option_Parameter_Config_Processing
338 :
nobodyさん :2006/01/04(水) 16:22:38 ID:PpH7t0Dm
キーワードから関連するトラックバックURLやらpingurlを収集する プログラムってないかな?
340 :
323 :2006/01/04(水) 19:59:55 ID:???
たくさんの回答ありがとうございます。 すべて試してみて一番わかりやすいのを参考にさせていただきます。 本当にありがとうございました。
341 :
nobodyさん :2006/01/05(木) 04:32:22 ID:+yKIo2wf
CGI&Perlポケットリファレンスを見ながらスクリプトを書いています。 この本を見てて、cryptの暗号化のキー(第2引数ですかね?)は、2文字異常渡しても無視されますと書いてありました。 僕が、今手にして自分で解読してみてるスクリプトに以下のようなものがあったんですけど、(出所はちょっと忘れてしまいました) $time=crypt($time,int(rand 100)); 第2引数が100になることもあるということは、3文字だから無視されますよね? これって、 $time=crypt($time,int(rand 99)); に書き換えた方がいいんですか?
>>341 >>162-辺りで出ているがrand 100は0以上100"未満"なのでint(rand 100)が100を取る事は無い。
しかし整数そのまま放りこむのはsaltの強度が落ちるからあまり良いとは言えないなぁ
因みにニ文字以上が切り捨てられるという仕様は暗号化した物の頭ニ文字はsaltなのでこうやって使う
$crypted eq crypt($pass, $crypted)
>>341 あ、無視の意味を勘違いしているようなので補足
無視されるのは余分な部分であって全体じゃないよ
abcdef -> a
100 -> 10
Digest::SHA使え。
>>344 それもSHA1じゃそろそろ怪しくなってきたね
今作るならSHA256か
346 :
nobodyさん :2006/01/05(木) 17:26:03 ID:+yKIo2wf
>>343 レス感謝!
でも
abcdef -> a
の部分は
abcdef -> ab
じゃないの?2文字でしょ?
文字の場合は1字とかじゃないよね?
>>346 ごめん
abcdef -> ab
が正解。いつの間にか消えてしまった
348 :
nobodyさん :2006/01/05(木) 18:23:39 ID:+yKIo2wf
>>347 うおぉおぉおぉおおぉぉ!!
自分でちゃんと理解してたーーー!!
ウレシーーーー!!
マジで嬉しい!
>>347 さん、本当にありがとうね!
あなたのお陰で、また1つ理解できました。
この感動を今の俺みたいな人に分けてあげたい。
頑張ろっと。
> この感動を今の俺みたいな人に分けてあげたい。 > 頑張ろっと。 今時 Perl ができる人間なんて、腐る程いますよ。
ここのスレタイの17バイト目から22バイト目までを音読しれ
351 :
nobodyさん :2006/01/05(木) 23:39:25 ID:+yKIo2wf
>>349 その腐った人の中に入りたいです!
>>350 初心者。。。?
んー、ごめん。
どういう意味だったのか分からなかったんだけど^^;
たまによくわからん流れになるな
>>354 DBIのドキュメントに書いてあったと思われ
356 :
nobodyさん :2006/01/06(金) 04:00:45 ID:iupFgDGk
>>352 すみません^^;
出来る人間にと書けば良かったです!
ご指摘ありがとう!
ここの人たちは優しい人が多いんですね!
ここの住人になりたいです!
>>355 ありがとうございます。できたっぽいです。2日ググり続けました。
DBI->connectのオプションでpg_enable_utf8=>1で自動的にフラグがたつようです。
DBIのドキュメントにも見つけられなく、海外のどこの馬の骨とも分からない人の
ソースからパクッてきただけなので詳細はよく分かりません。詳しいサイトご存知
でしたら教えてください。
pg_enable_utf8で検索したの?
ありがとうございます! This attribute is experimental and may be subject to change. とのことで、使ってる人も少ないんですね。
マヌケな質問な気がするのですが… sysopenのモードを変数で渡すことはできませんか? use Fcntl; my @mode = (O_RDWR,O_CREAT); sysopen(FH,"file",@mode); #1 sysopen(FH,"file",join('|',@mode)); #2 などとやってみたのですがどうにも渡りません。 直接定数を決め打ちしたり、定数のリストを渡すとうまくいくのですが、配列を渡すとなぜかだめなようです。 検索してみても決めうちの例しかでていませんし、 perldoc sysopenというのもないようで詰まってしまいました…。
>>361 my $mode = O_RDWR | O_CREAT;
>>361 「|」 はビット演算子のorだ。だから文字列でjoinは見当違い。
O_RDWRとかは定数。試しにprintしてみな。
そんな事も知らずにsysopenをどう使うのか疑問だ。
>>362 ,363
できました。どうもありがとう。
|がビット演算子というのを知りませんでした。
なんでこんな不思議な記号で区切るのか疑問でしたが、調べ方もわからなかったので為になりました。
リストで渡すと通ったのもO_RDONLYを使ったせいなようで、
展開されて「0256」になったせいで通ってしまったようです。
sysopenを使うのも、ただどこかのサイトで
「入出力を行うだけならばopenよりも安全だ」
というので盲目的に使ってしまっただけで深い意味はありません…。
ActivePerl5.8.7を使用しています。 Net::FTPを使用して、多数のファイルをアップロードするスクリプトを作りました。 255個目のファイルまでは正常にアップロードできるのですが 256個目のファイルをアップロードする所でputがエラーを返し(0を返す)、正常に送れません。。 (FTPソフトを使えば問題なくアップロードできる) 何か心当たりがあれば、よろしくお願いします。 use Net::FTP; $ftp = Net::FTP -> new($ftp_server); $ftp -> login($ftp_id, $ftp_pass); foreach (@filelist) { $ftp -> put($_); } $ftp -> quit;
366 :
356 :2006/01/07(土) 03:25:30 ID:hRPnI9VA
ここの住人になりたいなと思うので コテハンにしようかなと思います。 何か名前を付けてくれませんか!!
名無し or 死ね
371 :
nobodyさん :2006/01/07(土) 04:14:13 ID:snASfRD4
普通の文章なのに「!」で終らせることの出来る強い心をもっ人間に私はなりたい
372 :
366 :2006/01/07(土) 04:57:39 ID:hRPnI9VA
結構打たれ弱いのかも。。。 ちょっと凹み気味です。 あんましいぢめないで下さい!
>>372 つかコテ名乗って良いことなんか何一つないぞ
まずいです。 詳しくは2つ上の「改行コードを統一する」
>>365 試してみたが上手く動いたぞ。ちなみに俺の環境は
ftp鯖: CentOS + vsftpd
ActivePerl5.8.7-build813 WindowsXP からアップロードする
ファイル数 512個 ファイル名は 1,2,3,....512で中身も1,2,3,...512
で、512個すべて問題なくうP可能
とりあえず出力がうざいが、
$ftp=Net::FTP->new($ftp_server, Debug => 1);
とでもしてみたらいいんでない?
378 :
365 :2006/01/07(土) 14:31:54 ID:???
PerlのCGIでエラーをトラップする方法について教えてください。 エラーと見なされることが発生したら、エラー処理用のサブルーチンに飛んで、 エラーメッセージを表示して終了するようにしています。 その際、dieみたいにどこでエラーが発生したかも表示したいので、 引数でエラー内容と呼び出し元のサブルーチン名を渡しています。 &error('必須項目が未記入', 'submit') if (〜); sub error { my ($msg, $where) = @_; print "Content-type: text/html\n\n"; print "エラーが発生しました。$msg at $where\n"; exit; } こんな感じです。ただ、これだと&errorを書くときにいちいちサブルーチン名を 指定する必要があって、面倒です。 何か良い方法はないでしょうか。それとも何か根本的に考え方が間違ってますか?
382 :
nobodyさん :2006/01/07(土) 22:25:59 ID:7MUFvifm
htmlファイルを雛形としてそこから全行読み込んで一行ずつ検証し、行内に <textarea name="comment1" cols="60" rows="10"></textarea> という文字列が現れたらその文字列を <textarea name="comment1" cols="60" rows="10">$comment1</textarea> に置き換えてその行を出力するということを試みています (非該当行はそのまま出力)。 最単純に $line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|; とやってみましたが、「name=」を含めてその行のみのそれ以降の部分だけ出力されません (以降の行は出力されます)。 このとおり実行はされますが、エラー ログには「name は予約語となる可能性があります。あるいは、name の前にオペレータが抜けてはいませんか。」と残っています。 確かに、$name や $key などは perl で頻繁に使われる語ですが、上記のスクリプト内では $name を使っていませんし、それを使っているようなモジュールも明示的には使用していません。 また、「name=」自体は HTML のフォームに関する属性なので、これの名前を変更はできません。 ちなみに $line =~ s|"comment1" cols="60" rows="10"></textarea>|"comment1" cols="60" rows="10">$comment1</textarea>|; や $line =~ s|<textarea \x6Eame="comment1" cols="60" rows="10"></textarea>|<textarea \x6Eame="comment1" cols="60" rows="10">$comment1</textarea>|; もやってみましたが、まったく同じ結果に終わります。 推測するに、置き換え行自体に「name=」が現れたら NG のようです。 また、 if ($line =~ |^(.*)"comment1" cols="60" rows="10"></textarea>(.*)$|) { $line = $1 . "\"comment1\" cols=\"60\" rows=\"10\">" . $comment1 . "</textarea>" . $2; } も NG です。 解決策をお願いします。
383 :
nobodyさん :2006/01/07(土) 22:35:23 ID:7MUFvifm
$attr = "name"; としておいて $line =~ s|<textarea $attr="comment1" cols="60" rows="10"></textarea>|<textarea $attr="comment1" cols="60" rows="10">$comment1</textarea>|; としても駄目でした。 前投稿のとおり置き換え文字列には name= が入っていなくても駄目なので、結局、最終的にその行自体に name= があるとすべて駄目なようです。 完全に手詰まりです。
<textarea name="comment1" cols="60" rows="10">##comment1##</textarea> こうしておいて、、、 s/##comment1##/$comment1/; じゃだめなのかなぁ。。。 もしくは%sにしておいて、、、 sprintf $html_temp,$comment1; とかとか。
最悪
日本語のエラーログを吐くの?
>>382 つかエラーメッセージを意訳するな。そのまま書け。
389 :
382-383 :2006/01/07(土) 23:06:50 ID:5axJGSRV
>>385 駄目でした。置き換え文字列には含まれなくとも行自体に name= があると駄目なようです。
>>388 そのままです。
あとは、Perl のバージョンやパスが書いてあるだけです。
エラー行は確かにその正規表現が書いてある行なんだよな? あと悪いことはいわないから周りのコード晒せ。 見た感じループ内の処理みたいだからそのループ全体を。
391 :
382-383 :2006/01/07(土) 23:16:51 ID:5axJGSRV
>>384 open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html" . \n\n;
for ($i = 0; $i < @lines; $i++) {
$line = $line[$i];
#以下、前記のとおり
print $line;
}
exit 0;
392 :
382-383 :2006/01/07(土) 23:17:57 ID:5axJGSRV
× $line[$i] ○ $lines[$i]
おいコラ
394 :
382-383 :2006/01/07(土) 23:27:41 ID:5axJGSRV
質問しておいてなんですが、周辺も載せましたが、結果を見るとやっぱり置き換えのところで何か起きているとしか思えないです。
395 :
nobodyさん :2006/01/07(土) 23:29:19 ID:7SuLco6K
ふざけてやってるうちはいいけど、 最近真面目にそういうお馬鹿スクリプト書く初心者が増えてきたからねぇ…
396 :
382-383 :2006/01/07(土) 23:31:06 ID:5axJGSRV
テストなので、雛形 HTML のフォーム入力エレメントは今のところ textarea しかないのですが、input のフィールドも追加して検証してみようと思います。
397 :
382-383 :2006/01/07(土) 23:32:39 ID:5axJGSRV
どこがおかしいですか。初心者なのでわかりません。
>>391 「初心者なので」というセリフは大嫌いだが、
>>391 をそのまま実行すると
print "content-type: text/html" . \n\n; でエラー。当然だがね。
399 :
382-383 :2006/01/07(土) 23:35:54 ID:5axJGSRV
すみません。 open(TEMPLATE, "./template.html"); @lines = <TEMPLATE>; close(TEMPLATE); print "content-type: text/html\n\n"; for ($i = 0; $i < @lines; $i++) { $line = $line[$i]; #以下、前記のとおり print $line; } exit 0; でも先の問題は解決されません。
400 :
382-383 :2006/01/07(土) 23:36:41 ID:5axJGSRV
本題の解決策をお願いします。
>>399 こっちでは再現しないけど。「前記の通り」とかじゃなくてフルに書いてみ?
あとPerlのバージョン含めた実行環境も。
402 :
382-383 :2006/01/07(土) 23:41:59 ID:5axJGSRV
#!/usr/local/bin/perl $comment1 = ""; open(TEMPLATE, "./template.html"); @lines = <TEMPLATE>; close(TEMPLATE); print "content-type: text/html\n\n"; for ($i = 0; $i < @lines; $i++) { $line = $lines[$i]; $line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|; print $line; } exit 0; 駄目。 #!/usr/local/bin/perl $comment1 = "test"; open(TEMPLATE, "./template.html"); @lines = <TEMPLATE>; close(TEMPLATE); print "content-type: text/html\n\n"; for ($i = 0; $i < @lines; $i++) { $line = $lines[$i]; $line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|; print $line; } exit 0; これも駄目です。 template.html の内容と印刷結果は載せなくても大丈夫ですか。
というか何を隠そうとしてるのかしらないけど、「そのまま」ここに張りつけてみな。 そうすれば直ぐに答えがかえってくるんだから。
404 :
382-383 :2006/01/07(土) 23:44:11 ID:5axJGSRV
Perl バージョン: これは perl, v5.6.1 built for i386-linux です
405 :
382-383 :2006/01/07(土) 23:46:11 ID:5axJGSRV
>>403 >>402 に書いたのは全行です。
テストなので、これだけしか書いていません。
これだけしか書かないうちに先の不都合が見つかりました。
もっとも、最終的にやろうとしていることはありますが、それらはまだ書いていません。
この問題の解決が先なので。
もしや置き換え該当行は下から一行目?
407 :
382-383 :2006/01/07(土) 23:48:07 ID:5axJGSRV
もう一度そのまま貼り付け。 #!/usr/local/bin/perl $comment1 = ""; open(TEMPLATE, "./template.html"); @lines = <TEMPLATE>; close(TEMPLATE); print "content-type: text/html\n\n"; for ($i = 0; $i < @lines; $i++) { $line = $lines[$i]; $line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|; print $line; } exit 0;
>>402 前者も後者も正常に実行できている。ソースを見てもスクリプトの問題とは思えない。
エラーの出方から見てえらく特殊な環境で実行しているようにしか思えない。
perlバージョンだけでなく、OSのバージョンも。
409 :
382-383 :2006/01/07(土) 23:50:31 ID:5axJGSRV
>>406 「雛形の」という意味ですか。
であれば、違います。
雛形で言えば、該当行の下には
</form>
</body>
</html>
などの行もあります。
つかエラーログって何? コマンドラインで実行できないの?
411 :
382-383 :2006/01/07(土) 23:56:08 ID:5axJGSRV
雛形 HTML の内容は要らないですか。
414 :
382-383 :2006/01/07(土) 23:58:04 ID:5axJGSRV
OS バージョン: Red Hat Linux 7.2 2.96-118.7.2
415 :
382-383 :2006/01/08(日) 00:00:24 ID:0I8ISceR
エラー ログは設置した覚えはないですが、自動的に書庫化されているようです。 日ごとに書庫化されています。 スクリプトを実行するたびに書庫にログが追加されています。
>>415 RedHat7.2+perl5.6.1で「コマンドライン実行」した結果は?
「name は予約語となる可能性があります。あるいは、name の前にオペレータが抜けてはいませんか。」
なんて表示が日本語で出てくるわけじゃないよな?
417 :
382-383 :2006/01/08(日) 00:02:34 ID:0I8ISceR
勝手に貼れということはあまり参考にならないということのようなので、やめておきます。 必要なら言ってください。
418 :
382-383 :2006/01/08(日) 00:03:30 ID:0I8ISceR
>>416 FAQ に「当サーバではコンソールの使用を認めておりません。」とあります。
参考になりますか。
420 :
382-383 :2006/01/08(日) 00:05:19 ID:0I8ISceR
情報の後出しが多すぎるな。実行環境とかレン鯖だったことは最初に言うものだが。
あと自作CGIはローカルに実行環境を持って、そこでテストしてからレン鯖に持っていくのが常識。
で、結論から言うと
>>402 のスクリプトに異常はない。これでエラーが出てるなら
perl以外の問題である非常に高い。レン鯖の名前を出せるようなら、親切な人が
検証してくれる可能性もあるが。
通りすがりだが、自分のPCで試さないでサーバでテストするって・・・ 市ねってことでしょ。まさか自分のPCにPerlも入れてない?
まぁ精々KENTでも見習って適当にやってくれ。
ここは回答者も初心者ですね
「情報の後出しが多い」と言われて先にいろいろ書くと「長い」「ごちゃごちゃ書くな」と言われる 初心者回答者は答えられない言い訳を質問者に転嫁することが多いですね
Perlコーディング初心者(が)質問(に答える)スレ Part 45 ですが何か?
ガッテン!ガッテン!
まぁ、初心者同士の互助会ってことだな
初心者の質問に答えられない達人ぶった初心者が多いスレはここだと聞いてやってきました
環境依存の問題に答えようがあるかい
達人って……小学生かよ
誰も答えられないのですか?
「環境依存」と来たか ID出してもどうせだれも答えられないんだからID出すこと自体無意味
421=435 初心回答者は自画自賛もお手の物です。
ところが
>>421 以外の回答が出てこない。何故だろう。
' ' => '\s'
ちなみに、空文字のかわりに空白を入れるなんて邪道は嫌です。
つーか スペースじゃなくて文字が入っていても結果が同じだと言ってるのだから何の解決にもならない 二つスクリプト貼ってるだろ よく読め ボケカス
ぅはwwwww 俺ンとこでも再現した!
nameが評価されてるだろ エラーメッセージ嫁
テンプレート <HTML> <BODY> <FORM action="" method=POST> <TEXTAREA name="comment1" cols="60" rows="10"></TEXTAREA> </FORM> </BODY> </HTML> 実行結果 <HTML> <BODY> <FORM action="" method=POST> <TEXTAREA </FORM> </BODY> </HTML>
KENT様を見習ってヒアドキュメントでも書かれたらいかがですか?
出ねーよ モノは出力されてんだから シェルからでも同じ
Content-type: text/html <HTML> <BODY> <FORM action="" method=POST> <TEXTAREA </FORM> </BODY> </HTML>
というか、こんな横暴な質問者を助けるんだ…。 みんな優しいのな。 仕事なら自分で解決しろとしか俺は言わんが。
perl 5.6.1 fedora core 4
FreeBSD4.11+perl5.8.1では再現しない。スクリプトもテンプレもEUC。 content-type: text/html <HTML> <BODY> <FORM action="" method=POST> <textarea name="comment1" cols="60" rows="10">test</textarea> </FORM> </BODY> </HTML>
初心者ほど猿のように実行環境はなんだOSはなんだと質問する いったいおまえらにバージョンの差異がわかるのかと(ry
>>453 質問者が仕事じゃないときの答えられないお前の言い訳は?
>>456 再現する環境としない環境がある以上は聞かなきゃ仕方がないだろ。
どうして「しかたがない」のやら……まったくもって頭の良い御方の発言は理解できませぬ
冬休みいつまでだよ
$comment1 = ""; # の場合 Content-type: text/html <HTML> <BODY> <FORM action="" method=POST> <TEXTAREA </FORM> </BODY> </HTML> $comment1 = "test"; # の場合 Content-type: text/html <HTML> <BODY> <FORM action="" method=POST> <TEXTAREA </FORM> </BODY> </HTML>
で、原因と解決策はいつ出てくるのかね?
ActivePerl5.6.1でも再現しねーな。なんだこりゃ?
それこそ解らないやつが聞いても仕方がないわけだが。 というかこいつらのデバッグってただ流せれば終わりなの?
それがKENTクオリティ
>>465 遠まわしに言っても理解できないから単刀直入に結論をどーぞ
試行置換文 $line =~ s|<TEXTAREA name="comment1" cols="60" rows="10"></TEXTAREA>|<TEXTAREA name="comment1" cols="60" rows="10">$comment1</TEXTAREA>|; $line =~ s|comment1" cols="60" rows="10"></TEXTAREA>|comment1" cols="60" rows="10">$comment1</TEXTAREA>|; どっちでもダメだわこりゃ
@FOO=<>; するぐらいならヒアドキュメントのほうがどれだけいいことか。
評価部分にはnameがなくっても$lineにあるなら同じようになるようだ
471 :
455 :2006/01/08(日) 02:38:25 ID:???
>>469 質問者の前提条件をひっくり返してしまってよいなら誰でも答えられるがなアンタ
textareaじゃなくてinput type=text name=...で試してくれんか
これ以上なく単純明快な形で既に解決策が提示されているものを猿が罵倒した件について。
475 :
455 :2006/01/08(日) 02:42:47 ID:???
>>473 普通に置換できてる。つか当たり前っちゃ当たり前。
>>469 あの質問ではあんなテンプレートあってもなくても意味がないような気がするが
のちのちの完成形ではテンプレートを読み込むというのが絶対条件なら
くずせないだろ、バカチン
Content-type: text/html <HTML> <BODY> <FORM action="" method=POST> <INPUT type=text </FORM> </BODY> </HTML>
KENT様を見習え。バカチン!
>>474 解決策などありませんでした
ありませんでした
ありませんでした
requireやuseしていない組み込みモジュールに$nameがあると見た!
赤帽系のperlが変ってこと?
>>480 仮にそんなことがあるとしてもそんなことが判明しても解決にならない。
formのnameが別の名前に置き換えられないんだから。
そこらへんのHTTPデーモンにはエラーログを日本語で出力してくれるものがあるの?
フォームでは「name/value」しか使えないのケ?
>>483 アーカイブ化されてるつってんだからレンタル屋がraw->日本語処理スクリプトも置いてんだろ
もうこいつら頭良すぎ(w 全然付いていけない。 オヤスミナサイ。
daemonのエラーログには何にも残ってねーな つーかエラーじゃないし
何の役にも立たない
>>486 の捨て台詞カッコイイぜ
再現したって言う奴、これどうよ? $line =~ s|<TEXTAREA name="comment1" cols="60" rows="10"></TEXTAREA>|<TEXTAREA name="comment1" cols="60" rows="10"></TEXTAREA>|;
ああ それも試したんだわ これも試した↓ $line =~ s|comment1" cols="60" rows="10"></TEXTAREA>|comment1" cols="60" rows="10"></TEXTAREA>|; 結果 Content-type: text/html <HTML> <BODY> <FORM action="" method=POST> <TEXTAREA </FORM> </BODY> </HTML> どうやらこうやら$lineがnameを含有していて評価部分にnameがあろうとなかろうと$lineを評価してしまうとダメらしい $lineを評価なしにそのままprintしたときだけテンプレートのすべてがprintされる
>>491 仮にそれがperlのバグだとしても今まで出てこなかったのが変だよなー
>>492 再現しない環境があるんだから
それが大多数ならおかしくないな
perlやosの種類・バージョン・リビジョンの組み合わせは星の数だ
494 :
366 :2006/01/08(日) 04:52:43 ID:ekOfQHSy
>>374 そうなんですか!?知りませんでした。
ご親切にありがとうございます!
質問していいですか?
「data.txt」 という何か書き込みされている テキストファイルがあるとして
open(F,"data.txt");
while(<F>){
chomp;
push(@arr,$_);
}
close(F);
$num = @arr;
$num += 1;
という感じに書き込みした順番付けをしてあって、順番は1から始まる数字なんですが
このスクリプト4行目の「$_」には、行番号がセットされているんですか?
@arrというのは、どの部分を指しているんでしょうか?
CGI&Perlポケットリファレンスには、「$_」は特殊変数と言う事位しか触れられていません。
@arrというのは、「ただのarrという名前の配列」と理解してるんですが、これは大間違いですかね?
495 :
nobodyさん :2006/01/08(日) 05:04:36 ID:Pbsz8/Oh
4行目は改行が削られたデータ $numは要素の数が入る 最後の行、その他の解釈の仕方があればそれを知りたい
>>494 「array(配列)」を略しただけだと思う。つかそのくらい想像せい。
497 :
366 :2006/01/08(日) 05:15:05 ID:ekOfQHSy
>>374 そうなんですか!?知りませんでした。
ご親切にありがとうございます!
質問していいですか?
「data.txt」 という何か書き込みされている テキストファイルがあるとして
open(F,"data.txt");
while(<F>){
chomp;
push(@arr,$_);
}
close(F);
$num = @arr;
$num += 1;
という感じに書き込みした順番付けをしてあって、順番は1から始まる数字なんですが
このスクリプト4行目の「$_」には、行番号がセットされているんですか?
@arrというのは、どの部分を指しているんでしょうか?
CGI&Perlポケットリファレンスには、「$_」は特殊変数と言う事位しか触れられていません。
@arrというのは、「ただのarrという名前の配列」と理解してるんですが、これは大間違いですかね?
498 :
494 :2006/01/08(日) 05:52:31 ID:ekOfQHSy
>>495 早速のアドバイスありがとうございます!
...と言うことは、例えば「date.txt」の中身が
山田太郎,
[email protected] ,\n
鈴木花子,
[email protected] ,\n
佐藤次郎,
[email protected] ,\n
だった場合、具体的に言うと「$_」の最初は
「山田太郎,
[email protected] 」で、2番目に
「鈴木花子,
[email protected] 」が来て、3番目に
「佐藤次郎,
[email protected] 」という順番でセットされていく訳ですか?(ただ\nが抜けただけ?)
これが、@arrにセットされていく訳だから@arr[0]は【山田太郎,
[email protected] 】という理解なんですがOKですかね?
その後の、「$num = @arr;」という処理の仕組みが詳しく説明できないのですが、
結果は【山田太郎,
[email protected] 】は【山田太郎,
[email protected] ,1】となっています。
>>495 さんは【$numは要素の数が入る】と言われてますが、もう少し噛み砕いてもらえないでしょうか?
「$num」には、「@arr」からどんなデータが渡されているのでしょうか?
>>498 非常に痛々しいが答えてあげる。
「$_」の中身が知りたければprintしなさい。
pushの解釈はそれでおk。
「$num = @arr;」は@arrの要素数、つまり
>>498 の例の場合は3が入る。
これ以上噛み砕きようがない。その後で1足してるけど意図は不明。
つか書いたのお前だろうがよ。
>>498 printすりゃいいだろ。
少しくらい自分で解決できるようになれ。
あと関数の意味くらい調べろ。
501 :
498 :2006/01/08(日) 06:08:00 ID:ekOfQHSy
間違えてました!
10行目の
@arr[0]は【山田太郎,
[email protected] 】は、
$arr[0]は【山田太郎,
[email protected] 】でした!書き間違えてました!
もう一つ補足です。
僕の中ではまだ仮定なのですが、
「$num = @arr;」という処理は、「@arr」の中身を順番に「$num」に渡す。
「@arr」には3つの変数がセットされていて、それぞれ
「山田太郎,
[email protected] 」
「鈴木花子,
[email protected] 」
「佐藤次郎,
[email protected] 」
そんでもって、それらの名前は「$arr[0]」、「$arr[1]」、「$arr[2]」となると。
>>495 さんが言ってた【$numは要素の数が入る】の【要素の数】とは、
「$arr[0]」の「0」の事だったんですかね!
だから、「$num = @arr;」の処理をすると、「1」、「2」、「3」になってる!
と考えれば納得できますけど、この仮定は合ってます?やっぱりダメですか?
>>501 print $num; してみ? 答えが出てくるから。
そろそろ放置しないと、このレベルのガ湧き出すぞ
いいんじゃね? 初心者スレだし。
ID:ekOfQHSyは初心者以前にバカだがな。
506 :
501 :2006/01/08(日) 06:42:29 ID:ekOfQHSy
さっきのdata.txtで
#!/perl/bin/perl
require "jcode.pl";
print "Content-type: text/html\n\n";
open(F,"data.txt");
while(<F>){
chomp;
push(@arr,$_);
}
close(F);
$num = @arr;
$num += 1;
print $num;
をやったら、「4」が出ました!
>>499 さんが「3」が入るの意味が分かりました!
みなさん、僕のレベルが低くてすみませんでした。
でも、ありがとうございました!
CGI&Perlポケットリファレンスはお勧めだと言われて買ったんですけど、基本と言うか仕組みと言うか、その辺を分かった上で使う物みたいな気がします。
ただ、僕のレベルが低いだけかもしれませんけどね。
やっぱり、perlやphpってのは本だけでやるものじゃなくって、ちゃんと学校行って勉強するべきなんですかね?
>>503 早くこのレベルから抜け出たいです!
>>503 さんはどれくらいの経歴の持ち主なんですか??やっぱり何年もされてるんですか?
>>506 ネットの情報だけでも一週間あればBBSくらい作れるやつはゴロゴロしてる。
逆に学校で習っても全然理解できないやつもゴロゴロしてる。
要は素質の問題。素質の差を埋めるのは勉強の仕方と、知識を求める意欲。
>>506 安易に2chに頼るヤシは成長しない。
悩んで悩んで悩みぬいてのちに来なさい。
それと、馴れ馴れしくしないでくれるかな?
お前と茶飲み話をするためにここにいるんじゃないんだから。
509 :
506 :2006/01/08(日) 07:14:08 ID:ekOfQHSy
>>507 簡単な掲示板やスケジュール表は作ったりしました!
最初は、本も買ってなかったのでネットで勉強していました。そこで、配布されてたスクリプトを試して、こんな感じにしてみたいなと思ったら少し書き換えて遊んだりしていました。
なので、自分で1から作ったりは出来ませんでしたが、ほんの少しずつ「なんだか、何か分かんないんだけど、何かが分かってきたような気」がしてごくごく簡単なスクリプトを書いてみたら、
Internal Server Errorと何回も何回も出てきて悔しかったですが、やっと画面に文字が出てきた時はかなり嬉しかったんです!!
僕は、プログラムなんて向いてないだろうし、どうせ出来ないんだから...
と思っていたので余計に嬉しかったです!興奮して眠れませんでした!
>>507 さんが学校で習っても全然理解できないやつもゴロゴロしてるというのは想像もつきませんが
恥ずかしいけど、僕には学校に行く余裕も無いのでネットと本で勉強して、自分が作りたいようなプログラムなら出来るくらいにはなりたいです。
でも、いつかちゃんとした設計の仕方とかも覚えてみたいので、まずは今の自分が出来ることからやってるという段階です。
>>507 さん、みなさん、色々親切にしてくれてありがとうございます。
正直、僕程度のレベルじゃみなさんの邪魔になるだろうし、野次られても全然構いません。
これからはちゃんと自分で調べれることは調べてみてから相談します。無視はこたえるので、野次でも何でも良いから教えてくれたら嬉しいです!!
ありがとうございました。
510 :
506 :2006/01/08(日) 07:24:11 ID:ekOfQHSy
>>508 >安易に2chに頼るヤシは成長しない。
>悩んで悩んで悩みぬいてのちに来なさい。
はい。基本がなっていない為、最初は、数多いかもしれませんが
理解して、ここに来る回数は減らします。努力します。
>それと、馴れ馴れしくしないでくれるかな?
>お前と茶飲み話をするためにここにいるんじゃないんだから。
ごめんなさい。
よし、じゃあID:ekOfQHSyはコテハンを名乗ることを許す。
512 :
506 :2006/01/08(日) 07:34:13 ID:ekOfQHSy
>>511 ありがとうございます。
でも、前に親切な人がコテハン使っても良いこと無いって......??
言われたままに納得してましたが、そうなんですか?
>>512 気にするな。名乗りたいという気持ちが大事。
つかすぐに他人の言動に左右されるな。意思を強く持て。
514 :
512 :2006/01/08(日) 07:47:55 ID:ekOfQHSy
>>513 じゃあ、コテハン名乗りたいです!
というか、ここでのコテハンを持ちたいんです。ここの住人になりたいと思ったから!
よかったら、僕に命名してくれませんか
>>514 山田太郎、鈴木花子、佐藤次郎 好きなものを選べ
皆暇なんだな…。
>>514 ゲーム脳、ゆとり教育、5才児 好きなものを選べ
朝見てみれば、何この流れ。 「ここの回答者は初心者ばかり」って言っていたやつは、 初心者以下だったことがはっきりしたのは収穫だったけど。
伸びてると思ったら、なにこれ…(;´Д`)
VIPから沸いて出たうんこだよ
伸びてると思ったら・・(略
521 :
nobodyさん :2006/01/08(日) 13:15:22 ID:Pbsz8/Oh
>516 暇ってよりも、みんなはNGワード登録したいだけなんじゃないかなとw
ここ雑談スレだし
525 :
nobodyさん :2006/01/08(日) 23:06:59 ID:Uz3qgn+x
例えばなのですが、 A.cgiで入力した出力結果(たとえばヘローワールドとか)を B.htmlの中に埋め込んで表示したい場合、って どうやって表示させるのでしょうか? A.cgi→B.cgiに表示させるのは判るのですが・・・
ssi
ログに吐く→ログを読んでB.htmlを作成→B.htmlへ移動 (゚∀。)
iframe
B.htmlをテンプレートにしちゃうとか。
530 :
nobodyさん :2006/01/08(日) 23:56:33 ID:Pbsz8/Oh
>529のが理想的
531 :
514 :2006/01/09(月) 00:40:09 ID:YG2ddn0l
戻りました。 初心者の質問スレなので、スレ違いの発言は避けます。すみません。
532 :
nobodyさん :2006/01/09(月) 00:42:41 ID:Exqn7RF4
>531 その書き方だと「僕は初心者じゃ有りません」ってなっちゃうぞ! あっ!初心者にも達してないってことなのか! すみませんでした!!
VIPから出てこないでね
534 :
nobodyさん :2006/01/09(月) 00:59:21 ID:DuxY6YkJ
でもEk君素直でいい子だよ。 自分で調べなさすぎるけど。
535 :
531 :2006/01/09(月) 01:39:57 ID:YG2ddn0l
>>532 あっ、いやそうじゃなくてですね。
僕は初心者には違いありません。
ただ、余計なことを書き過ぎたので必要以上の私語は慎みますと言う意味です。
536 :
531 :2006/01/09(月) 01:58:24 ID:YG2ddn0l
早速なんですが、僕は自分の理解が正しいのか間違っているのか正確な解答を知りません。 そこで、僕の理解が正しいのかだけ答えてもらえませんか? フォームで入力したものをcgiファイルに渡して、それを変数に入れて使うとき $i=$FORM{'i'};とか、$FORMが$inになってるものとか、$i=$cgi->param('i');みたいなのとかありますよね。 3番目が別物と言うのは何となく分かるんですが、1番目と2番目もやはり違うものどうしですか?
$FORMや$in、$cgiがどうやって生成されているか見てきて下さい>< 前者の二つはcgi-lib.plを使って後者はCGI.pmを使っていると見受けられます。
初心者より低いレベルのやつがおるな
539 :
536 :2006/01/09(月) 05:18:37 ID:YG2ddn0l
>>537 ありがとうございます。
>前者の二つはcgi-lib.plを使って後者はCGI.pmを使っていると見受けられます。
と言う点については、理解しています。(cgi-lib.plやCGI.pmの説明は出来ませんけど^^;)
僕が分からなかったのは、$FORMと$inについてで
両方ともcgi-lib.plをrequireしていますよね?んでも、違う変数にセットしている。と言うのがいまいち理解に苦しんでいたんです。
この2つ(もっとあるのかもしれませんが)を使い分けるような必要性があるから作られていると思うのですが、それはどんな時なのでしょうか?
>>539 cgi-lib.plの中身を見れ。すぐわかる。
そういうことしようとしないですぐ聞いちゃうから呆れられるんだよ。
541 :
nobodyさん :2006/01/09(月) 05:29:28 ID:uNKy5Wkj
>539 for ループを使うときに $i を使う人と $j を使う人が居る 配列に @list を使う人と @arr を使う人が居る ただそれだけ 難しく考えすぎ
542 :
539 :2006/01/09(月) 06:12:11 ID:YG2ddn0l
>>540 すみません。読もうとしたことはあったんですが、正直、全く読めず僕にはまだ早いのかもと諦めていました。T_T
でも、それも読むべきなんですね。果てしない道のりですね。
ご指摘、どうもありがとうございました!
>>541 そうなんですかー。
あまり難しく考えないで良いとわかって良かったです!
少しずつ、基礎の基礎が分かるようになって行けば、基礎の段階に進めるので
地道に頑張ります。
543 :
nobodyさん :2006/01/09(月) 09:38:58 ID:DuxY6YkJ
>>542 君ひどすぎるよ。
わからんところがあったら自分で少しは調べろよ。自分で少しは考えろよ。
まず、「Perl 入門」でもググって、Perlの基礎を勉強しろよ。
「初心者以下」っていわれるのはそれすらしてないからだろうが。
しましたとかいうなよ。実際君は基礎的な構文すら理解してないんだから。
わかったら
>>1 と
>>7 読め。
もうこのスレだめかもわからんね
Win-XpのコンソールでPerlのコマンドラインスクリプト書くとき、 unixの perl -e 'print $var, "\n";' をどう書いたらいいでしょうか。 NG: perl -e "print $var, \"\n\";"
NG: perl -e "print $var, \"\n\";"
perl -e "print $var, qq{\n}"
>>546 ども。
あれ、それででけた。さっき、だめだったのは何かの間違い。
でも、やっぱcmd.exeでは、かなり面倒ですね。
>>547 あ、そんな手もありましたか。どうもです。
50 くらい上の form の話って、 HTML::FillInForm とか 知ってれば悩まなくてよかったのにね。
552 :
nobodyさん :2006/01/10(火) 03:27:54 ID:j2HoU23f
こんばんは!
プログラムは面白いです。今まで嵌っててここに挨拶に来るのも忘れてました。
>>543 ご指摘ありがとうございます!!
今の僕じゃ何も言えないので、お言葉、だまってありがたく頂戴します。
>>all
あの、ここは初心者の質問スレということなので僕にとって知りたい事を質問させて頂いてたつもりだったんですが
どのレベルなら許されますか?
お前をつきっきりで介護するスレじゃねえってことだよ。
554 :
nobodyさん :2006/01/10(火) 04:15:56 ID:NnDCxprG
>>552 関数を全部覚えろとは言わない。
多用される関数・構文ぐらいは覚えた上での質問を。
とりあえずリファレンスは手元に置いておいたほうがいい
個人的には技術評論社が好き
>>552 ここは「知りたいことを質問する場」じゃなくて
「初心者じゃ手に負えないこと」を質問する場所。
お前のように試行錯誤もしないで疑問を片っ端から
垂れ流す場所じゃ無いってこと。つかお前何歳?
ってか、皆スルーすべき。かまってあげすぎ。
スルーされることによって、どういう質問なら適切か、答えが返ってくるかって覚えていくもんだろ?
>>555 >つかお前何歳?
思わず笑っちまったがこの質問は無いだろうw
何歳だったら良いって問題じゃないっつーか。
この質問が既に話を聞いてあげる姿勢の現れっつーか。
深みに嵌りかけてますぞ
>>556 どう見ても皆ネタとして遊んでいるだけ。深読みしすぎ。
558 :
nobodyさん :2006/01/10(火) 09:25:04 ID:j2HoU23f
unshiftを使った構文を使いたいので、まずサンプルで試していたのですが unshift(@hoge, splice(@huga, 1, 1)); @hugaの1番目だけを、@hogeの先頭にくっつけたいのです。 本の通りなのですができません。 何故なのでしょうか?
> unshift(@hoge, splice(@huga, 1, 1)); splice @huga, 0, 1
>>559 それなら shift @huga でいいような...
561 :
nobodyさん :2006/01/10(火) 10:57:13 ID:j2HoU23f
まだずっとやってるんですが、何故ならないんだろう。
>>559 ,
>>560 レスありがとうございます。
「splice @huga, 0, 1」も「shift @huga」も、@hugaの1番目のみを削除しているんですよね?
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
っていうファイルを
2,3,4,5
7,8,9,10
12,13,14,15 と変える...?
ちょっと違うような。@hugaから抜いた1番目のものを
@hogeの先頭にくっつけるには
unshiftを使って、<配列の先頭に要素を追加する>と書いてありました。
更にそのまま引用すると
●配列の$i番目の要素を別の配列の先頭に追加する
unshift(@newarray, splice(@oldarray, $i, 1));
(CGI/perlポケットリファレンスより抜粋)
何が間違っているのでしょうか......
>>561 perlの配列は添字が0から始まるので、最初の要素から
0番目,1番目,...とあらわすことがよくあります。ポケット
リファレンスはこの書き方を採用しているようですな。
>>561 > 何が間違っているのでしょうか......
ここ↓
> ●配列の$i番目の要素を別の配列の先頭に追加する
splice の第二引数は配列の先頭からのオフセットなので 0 から始まるのよ。
即ち通常は splice し始める要素の添字と一致する。従って、
> unshift(@newarray, splice(@oldarray, $i, 1));
の動作はその本の記述に合わせると、
「配列の$i+1番目の要素を別の配列の先頭に追加する」
ということになる。
@oldarray から取り除くものが先頭要素に固定されているのなら
>>559 の言うように、
unshift @newarray, shift @oldarray;
で等価。
564 :
563 :2006/01/10(火) 12:12:37 ID:???
565 :
563 :2006/01/10(火) 12:44:26 ID:???
>>561 おせっかいついでに、
当方は
「あなたがどんな結果を期待しているのか」
「実行したコード」
「実際の結果」
のうちどれひとつとして知らないので、本来は「何が間違っているのでしょうか」と問われても「何かが間違ってるんでしょうねぇ」としか答えられないのですわ。
だから期待した返答がなくても、あるいは期待しなかった返答すらなくても許してね。ぼくがんばったの。
strictじゃないperlのcgiも、$を$main::で置換したらuse strictに大変身。 マジお勧め!
>>566 $namae = 'kansuu';
$bangou = 1;
${$namae . $bangou} = kansuu;
&$kansuu1;
sub kansuu { print 'hoge' }
3行目をクオートしてあげないと怒られちゃうぞ。
strictに初挑戦してみた これでOK? ちなみになぜ&kansuu1;でいいのかいまいちわかってなかったりするw myとか使ってやってみてるけどデキネorz #!/usr/local/bin/perl use strict; $main::namae = 'kansuu'; $main::bangou = '1'; $main::{$main::namae . $main::bangou} = 'kansuu'; &kansuu1; sub kansuu { print 'hoge' }
570 :
567 :2006/01/10(火) 16:31:00 ID:???
>>568 それがstrictじゃ無い環境だと勝手に文字列扱いしてくれるんだよね、これが
-wで警告が出るけど、その辺の解釈が微妙だからstrict subsがあるわけだ
my $hoge = func;
sub func { print 'hoge' }
print $hoge;
>>569 ちょ、おまw
>>567 はネタで考えられる限りの悪例だぞw
> ちなみになぜ&kansuu1;でいいのかいまいちわかってなかったりする
${$namae . $bangou}ここで$namaeと$bangouを連結した名前の変数、
つまり$kansuu1に代入してるから。
strictに真面目に書くとこう
my $name = 'kansuu';
my $num = 1;
my %hash;
$hash{$name}[$num] = \&func;
&{$hash{$name}[$num]};
sub func { print 'hoge' }
>>570 俺もまさかそのままで通るとは思わなかったw
一応strictになってるっぽいw
あと、$kansuu1に連結して、&kansuu1で呼び出すのはわかるんだけど、
なぜ&kansuu1;でサブルーティン呼び出せるのかがいまいちわからんのだ
>>571 あースマン$がないの読み落としてた
これは、名前空間を直接操作してmain::kansuu1にkansuuを登録しちゃってるから。
$, = "\n";
print keys %main::;
とかやってみるとわかると思う
なるほど ちょっとだけわかってきた気がする #!/usr/local/bin/perl use strict; $main::test = 'yeah'; $main::{$main::test} = 'kansuu'; &yeah; sub kansuu { print 'hoge' } これでも呼び出せるって事か つかややこしいなぁ 初心者の俺には理解の範疇を超えそうな感じだよ 色々試してがんばって消化してみる
574 :
nobodyさん :2006/01/10(火) 17:34:45 ID:NnDCxprG
C で関数を関数へのポインタで呼ぶ。 ってことが Perl でも出来るんですね
こういう使い方ってこなれた人はわかってて当然?
俺はこのやり取りを見ずに
>>573 を見ても、
何でだかさっぱりわからなかったと断言できるかも。
普通にsub yeahを探しちゃうだろうし。
だから悪例だっつってるだろ。んなもん消化するな。
main::をつければstrictというのもネタだから信じないように 確かにuse strict;は通るがそういう問題じゃない
嫌がらせには使えるな
初心者惑わすには持って来いだな。
文字コード変換で質問です。 Shift_JISコードのCSVファイルを読み込んで、jcode.pl を使ってJISコードに変換してから ブラウザに吐き出すCGIプログラム(プログラムはJISコード)を作成中なのですが、 1. CSVを読み込む 2. htmlタグ文字のエスケープ(<>&"') 3. JISコードに変換 4. 出力 の場合には文字化けは起こらなかったのですが、2. と 3. の処理を逆 (変換してからエスケープ)にすると文字化けしてしまいました。 これは、JISコードの日本語文字中に、htmlタグ文字(<>&"'のどれか)が 含まれているのが原因という認識でいいのでしょうか? その回避策として、Shift_JISの状態でエスケープをするのは問題ないでしょうか? (Shift_JIS の場合は「\」が入る文字があるのは認識してますが他にも含まれる文字があればマズイですよね…) ご教示いただけると幸いです。
>>581 エスケープ対象が2.に示したものだけなら、シフトJISの2バイト目には来ないので大丈夫だろう。
584 :
581 :2006/01/11(水) 02:32:30 ID:???
>>582 ,583
レスありがとうございます。
JISコードの場合は <>&"' が全部出てくる可能性があるんですね。
非常に勉強になります。。
ちなみに、タグ文字をエスケープ(< など)で現れる
セミコロンは自体は大丈夫でしょうか?
(日本語の1byte目とくっついて文字化けなど)
とりあえずはSJISのエスケープでやってみます。
ありがとうございました。
>プログラムは JIS コード これは絶対外せないルールなのか?
587 :
nobodyさん :2006/01/11(水) 10:05:55 ID:CQ4aDWhi
日曜日とかがCGI休みのサーバとかじゃない?
589 :
587 :2006/01/11(水) 10:49:16 ID:???
590 :
587 :2006/01/11(水) 10:56:49 ID:???
Web製作板でやれ
コーディング以前の問題
593 :
587 :2006/01/11(水) 15:39:23 ID:CQ4aDWhi
そうですか・・ 薄々聞く場所を間違えたのではないかと思っていましたが お邪魔しました 他をあたります レスありがとうございました
こんな感じでURLから文書取ってくるのを書いたのですが、
use strict;
use warnings;
use utf8;
binmode(STDOUT,':encoding(shiftjis)');
use LWP::UserAgent;
my($ua,$req,$res);
$ua = LWP::UserAgent->new;
$ua->timeout(10);
$req =
HTTP::Request- >new( GET => $ARGV[0] );
$res = $ua->simple_request($req);
この状態で$res->header('Content-Type')を出力するとなぜか二重になって返ってきます。
例えばYahooにアクセスさせて出力すると
text/html;charset=euc-jptext/html; charset=euc-jp
なんて文字列が返ってきます。
これはおかしいと思うのですが、なにか間違えていますか?
HTTP::ResponseはActive Perl 5.8.7についてたやつで、バージョン1.52です。
for構文(hogeの所は違う処理)がプログラム全体でちょくちょく出てくる場合って、 $iにはmyとかつけてあげた方が負荷的には少なかったりする? 再利用されるならグローバル変数でも問題なさそうな気がするけど、 こういう所って負荷を気にするならどうするのかなとちょっと質問。 もっと気をつけるところはあるんだろうけど、とりあえずやれるだけはやっておきたいので。
負荷云々の前に use strict しろと小一時間
つーか $ua-get() を使わないのは何で
598 :
nobodyさん :2006/01/11(水) 18:55:27 ID:rynIEcBA
JavaScriptのscreen.availHeightの様に、モニタの表示サイズを参照したりする事はできますか?
それぞれのOSのAPIでも使ってろ、と
>>597 リダイレクトを自動的に処理させたくないのでsimple_requestを使っています。
また $ua->get をつかっても、やはりContent-Typeが二重になって返ってきます。
今気がつきましたが、Googleにアクセスすると完全に二重ではなく
text/htmltext/html; charset=Shift_JIS
という、すごい中途半端な感じになります…。
$ua->max_redirect(0) ってしたらリダイレクトされんと思うが
>>600 それリスト ("text/html", "text/html; charset=Shift_JIS")
as_stringでprintしてみ
html中のMETAも読むみたいだね。
解決策は
>>602 が言っているようにリストで返ってくるから、配列で受け取る。
>>601 そうすればgetメソッドでもできましたか。
しかし、個人的に見た目にすぐわかるのでsimple_requestを使っておきます。
>602-603
なるほど。リストでしたか。
解決できました。本当にどうもありがとう。
META要素も読んでいるのですか?
HTTP関係のモジュールは継承がすごくてどのモジュールをperldocすればいいのか…。
というか use utf8; 意味解って使ってるか?
>>605 はい、スクリプト中のリテラルをすべてUTF-8として扱い、
それらをUTF-8フラグ付き文字列に変換するということですよね。
今回のスクリプトではマルチバイトの文字がないので意味はないですが、
よく、スクリプトを作るに出力するエンコードをbinmodeですぐ変換できるようにつけていました。
その習慣で今回もつけてしまいました。すいません。
おまいがやりたいのは use encoding 'utf8'; じゃないのか? まぁどっちでもいいのかもしれんけど。 use utf8; $useutf8したからこんな変数名も使える = '中身'; print $useutf8したからこんな変数名も使える; exit;
>>604 > META要素も読んでいるのですか?
LWP::Protocol::httpがLWP::Protocolのcollect()を呼び出していて、
そこでHTML::HeadParserをrequireしてる。
>>607 encondingプラグマはスコープがグローバルなはずなので、
他のエンコードで書かれたモジュールで問題が起きませんか?
マルチバイト使ったモジュールなんかそう無いので気にする必要ないかもしれませんが、
自分で何か作った時に、「した覚えがないのにUTF-8化されている」のはなんかハマる気がします…。
>>608 LWP::UserAgentからちょっと呼んでみました…。
…私には荷が重いようで…。
よくわからないので、headerメソッドの第1要素を使っておきます…。
どうもありがとうございます。
プログラム板でスレ違いといわれたのでこちらで聞き直します。
CGI を書くときには 有名なとほほさんの
http://www.tohoho-web.com/cgi/wwwperl.txt のように
環境変数を直接読むのが普通です。
ただ、近頃は、CGI.pm を使うの方法も増えているようです。
でも、聞いた話によると、CGI,pmを読み込む分、環境変数を直接扱うより遅くなるそうですし、
使えない環境もあるそうです。
なんか、CGI.pmのマニュアル見ても難しそうだし、結局、CGI.pmを使うメリットというのは何なのでしょう?
CGI.pmって200KBぐらいあるよね バイナリかよ、って笑っちゃうぐらい 今は物好きしか使ってないんじゃない?
612 :
610 :2006/01/12(木) 01:40:26 ID:???
>611 環境変数直接扱い → CGI.pm と変わってきたけど、結局、今はまた環境変数直接扱いの方が見直されてきたということで良いんでしょうか?
>>610 POSTのマルチパートも扱いが楽。
mod_perlもサポート。
ってところかな。
普通に使ってる。
有用なCPANモジュールの多くがCGI.pmを使ってるからな パフォーマンス的に問題が無ければ 何も考えないでCGI.pm使っておけば問題ないよ
そうかとほほが普通か…。
>614 逆を言えば、パフォーマンス的に問題があるかどうかわからない場合、CGI.pm使わない方が良い?
>>616 1日に何万ヒットもあったりレン鯖でCPUやメモリの制限に引っかかるようだったら
自前で用意したりカスタマイズしたほうが良いんじゃない
単純にデコードだけしたいんならCGI::Liteでもいいんじゃね?
結局はケースバイケース
パフォーマンス、パフォーマンスと初心者ほど過剰に気にするが、 パフォーマンスに困るぐらいのアクセスがあってから言えってんだ。
初心者でもアクセス数の多い企業サイトを担当することはある。 いや、俺のことだが。
後から修正すると大変だから最初に気をつけた方がいいしな。
その場合はすでにあるフレームから外れたことはしない方がいい。 初心者のうちは。
パフォーマンスもいいけど、セキュリティにも気を配ってくれよ。 なんて言っても、痛い目を見ないと分かってくれないわけだが。
>>622 初心者だから踏み台にされてることにも気が付かない。これ。
>>619 可哀想に。下手すれば一瞬で信用を失うな。
CGI.pmとか重すぎるし フォームをパースするだけにしか使わんから 自作した
626 :
nobodyさん :2006/01/12(木) 14:47:32 ID:fUom/aNQ
%VALUE = (1 => "#602000", 2 => "#FF0000", 3 => "#008040", 4 => "#0000BB"); %COMMENT = (1 => "未設定", 2 => "重要", 3 => "ビジネス", 4 => "個人用"); %CLASS = ("#602000" => "none", "#FF0000" => "important", "#008040" => "business", "#0000BB" => "personal"); こんなハッシュがある状態で、 $color = "#008040"; という変数を使って、 %COMMENTの"ビジネス"を取得って可能でしょうか。
可能だけどデータ構造を再考したほうがいいよ。
628 :
nobodyさん :2006/01/12(木) 15:07:23 ID:fUom/aNQ
できました! ハッシュのキーと値をペアで取り出せるeach関数なんていうのがあったんですね! %VALUE = (1 => "#602000", 2 => "#FF0000", 3 => "#008040", 4 => "#0000BB"); %COMMENT = (1 => "未設定", 2 => "重要", 3 => "ビジネス", 4 => "個人用"); %CLASS = ("#602000" => "none", "#FF0000" => "important", "#008040" => "business", "#0000BB" => "personal"); $color = "#008040"; while (($key, $value) = each (%VALUE)) { if ($color eq $value) { while (($new_key, $value) = each (%COMMENT)) { if ($key eq $new_key) { $comment = $value; } } } } print $comment; ありがとうございました。
データ構造悪すぎ。そんなもん普通ループいらんぞ。 例えばこう内側のループが消えるように。 while (($key, $value) = each (%VALUE)) { if ($color eq $value) { $comment = $COMMENT{ $value }; last; } }
やっちゃった。 $COMMENT{ $value }; → $COMMENT{ $key };
my $comment; { my %temp = reverse %VALUE; $comment = $COMMENT{$temp{"#008040"]} } が楽だと思う。
632 :
nobodyさん :2006/01/12(木) 19:21:41 ID:Xjv4jYTd
■ド素人です。 更新めんどくてperlでhtmlファイル管理、生成のプログラム書いてみたんだけど、なにせド素人なもんで、そんで質問以下の構造のモノって鯖に負担になりますか? ------------- 上:ヘッダ一部、トップlogo部分 左;左メニュー、左メニューに日記の新着記事、左メニュー広告欄 中:中央センター上部広告、本文(※)、フッタ 右:右リンクメニュー、右メニューの広告欄 部品的に見てこれらでレイアウト(構成)されてるサイトなんですが「本文(※)」以外は、全ページの共通表示部分になるのです。 要するに、サイト全体の共通部分を上記の様に部品別に.logでバラバラに保存してそれをCGIでHTML生成する時に、上記の部品を一回一回読み込んで、配列に代入して、printで出力。 本文は別のログに保存してあって、それだけブラウザで編集可能、それも同時に読み込んで行って、htmlとして出力される作り。 本文が保存されているlogファイルは、数十ページの本文内容を、件名<>本文<>etcの様に、<>で区切って、改行別に保存(ページ数が増えるとドンドン重たくなる) で、問題はここから★ サイト全体でページ数が200〜300ぐらいになるのです。(更新すりゃもっと増加) こう言った作りだと、共通表示部分、例えば、「左メニュー.log」のコンテンツへのリンクを変更すれば、サイトのページ300ファイルを全部更新(html生成)し直さなくちゃいけない訳です。 ちなみに300ファイル一気に生成するわけではなくって、同じスクリプトを複数設置しているのでサイトのテーマ別、例えば「サイト案内」のコンテンツだけで10ファイルあって、 それらを複数のスクリプトで計300ファイル程度を生成する作りです。 なにせド素人なもんで、変な無鉄砲なモノした組めないです。情けない これって、とゆうか、配列の乱用?と計、数メガにのぼるhtml生成って負担になりますか? なんか自分で書いてて、何がなにやらよく分からん様になってきた。アホ文失礼。orz
633 :
nobodyさん :2006/01/12(木) 19:24:13 ID:vLiWBj2u
ド素人じゃないのにド素人を装って教えを請うのはみっともない それともっと簡潔に でなきゃサイトを晒すか・・・
>>632 > 本文が保存されているlogファイルは、数十ページの本文内容を、件名<>本文<>etcの様に、<>で区切って、改行別に保存(ページ数が増えるとドンドン重たくなる)
本文が再帰してるように読める
> 数メガにのぼるhtml生成 ここが意味不明。 1つのHTMLファイルが数メガになるのか?
636 :
nobodyさん :2006/01/12(木) 19:50:39 ID:vLiWBj2u
まずテーマごとにそのテーマの ID を決める ログファイルは月ごとぐらいで更新する (といっても1年で1000ページとか行かないだろうから1年あたり1つのログでいいかも) (ただそのファイルがぶっ飛んだらその年のページが全部飛ぶことになるので月ごとが安全っちゃ安全か) ページ (行ね) には必ず ID を割り振る これを条件として、CGI には テーマ ID、ログファイル名、ページ ID を渡す ページ ID が取得できなければそのログ一覧を。 ログファイル名が取得できなければログ一覧 (各月の一覧か隔年の一覧なのかは自分で決めてね) テーマ ID が取得できなければテーマ一覧を表示する。 こうすればページあたりのヒット数とか、テーマ別ヒット数とかが用意に取得できるようになる
637 :
nobodyさん :2006/01/12(木) 19:51:47 ID:vLiWBj2u
投稿したあとフトおもった ディレクトリで分けてもいいな ./テーマ ID /ログファイル んでテーマ ID とするディレクトリにテンプレート用 HTML を置いておくとか
> CGI.pm というかクエリー取得のためだけに CGI.pm 使ってる人って十中八九 「なんちゃってモジュール使っちゃってます厨」 でしょ。 おまえら資源のムダだから大人しく自分で車輪の再発明してろと(ry
>>632 メニュー部分をSSIで呼び出すようにすれ。
表示は重くなるけど、悪くないトレードオフだと思う。
>>638 資源の無駄なんてことを言うレベルなら Perl やめるべきだと思うが
>>632 普通にblog使ったら?
今あるデータをコンバートする方向で。
システム作るより、コンバータ書いた方が楽だと思う。
どういうデータにしたら良いかは、実際にここログとか無料のblogに入ってみて、
データを書き出してみれば分かるはず。
その形式で出力するように、今あるデータに対するフィルタを書く。
642 :
nobodyさん :2006/01/12(木) 23:14:14 ID:pW3y8Hzc
643 :
nobodyさん :2006/01/12(木) 23:17:32 ID:vLiWBj2u
接頭語 (http とか ttp とか) がないと辛いんじゃないかな
>>642 正規表現で処理する以前に、
hoge.com/hoge/ge
がURLであるかどうか、判断できないような…。
www*.hoge.com/hoge/ge
とかならURLと見なして処理することも出来るだろうけど。
>>632 サーバー側でやるような処理じゃないよ。ローカル側で処理すべき。
そもそも300ファイルすべてに左メニューとか右メニューとか必要なの?
上部に1本、パンくずリンクでもあれば済むんじゃないの?
なんの情報も生まない、しかも広告入りのメニューが左右を延々占領するのもかなわん。ユーザビリティの履き違えかエロサイトの仕様だ。
>>640 精々頑張ってCGIモジュール読み込むか車輪の再発明してるといいよ。
ドメイン.(com|net|org|jp)/(パス文字列)+ くらいで大雑把にとか。
649 :
nobodyさん :2006/01/13(金) 00:29:47 ID:42x/OYc6
>648 テンプレみたいなあげ足取りですね
「車輪の再発明」なるものを避けるには天麩羅もまた一興
実際クエリ取得→CGIモジュールな人間は おまえらどこでそんな中途半端なモジュールの使い方覚えてきたのかと。
某配布の大御所…
>>647 その線でやってみました。 これで今のところ希望する動作をしてます。
$domain = '[\w\-]+\.[\w\-\.]+';
$path = '\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+';
s/(
http:\/\/|\b )($domain($path)?)/<a href=\"
http:\/\/$2\ ">$2<\/a>/g;
微笑ましい記述に萌え
653じゃないけど、 ちゃんと取得できてるのか確認しながらコーティングするとこうなるんよ
これってwarningsで警告出ないんだっけ?
メールアドレスもスキーム付いてればUR(I|L)だけどね。
\.[a-z]{2,6}\/ が見つかった前後で、URI として認められない文字列 (改行、空白、全角) が出てきた範囲を抜き出せばいいかも 正規表現で出来そうだけど、俺には無理w
661 :
653 :2006/01/13(金) 02:23:13 ID:???
11 a.m. のa.m.がリンクになってしまった… あと\bは\sの間違い。これでメールには
対処おk。
$domain = '[\w\-]+(\.\w[\w-]*\w)+';
$path = '\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+';
s/(
http:\/\/|\s )($domain($path)?)/ <a href=\"
http:\/\/$2\ ">$2<\/a>/g;
ドメイン名のそれぞれの部分は一文字より多いという姑息な手段で対処。
やってみた。ドメイン名の左側に@が付くものは除外。
TLDがないと色々誤爆しそうなので幾つか勝手に固定。
http://user:[email protected] / みたいものまでは考えないことにする。
my $regex_http = q{(?:h?t?t?p?:?//|(?<![@\w\-./]))([\w\-.]+(?:com|net|org|jp)/?[\w\-.!~*'();\/?:\&=+\$,%#]*)};
s|$regex_http|<a href="
http://$1 ">
http://$1</a >|g;
663 :
653 :2006/01/13(金) 03:26:13 ID:???
>>662 ありがとうございます。 一生懸命読解を試みました。 (?:)とか(?<!)等は探して理解しました。
なるほど、玄人な道具ですね。 それから正規表現を|でくくると中でいちいち/をエスケープ
しなくていいというのも便利な技で参考になりました。 それからURLに使われる特殊
文字ってもっとあったのですね。
1つ質問。q{}ってなんでしょうか? ある種のクオートな気がしますが記述を
見つけられませんでした。
open(LOG,"$datfile"); flock(LOG, LOCK_EX); @alldata = <LOG>; close(LOG); foreach $data (@alldata){ 中略 } print "<p>完了しました。</p>"; という構文で、ファイルの各行の文字列を読み取って、処理を行う、という動作をさせ、 終了時に「完了しました。」の文字列を表示、という風にしているのですが、 ファイルの行数が少なかった頃は何の問題もなく処理を完了していたのですが、 800行を超えた辺りから、「完了しました。」の文字を表示しないこともあります(ブラウザは完了したような振る舞いをします)。 また、処理の結果を見ても、ファイルの途中までしか処理されていないようです。 恐らくforeach文の回数が多すぎるからだと思うのですが、何か対処法は御座いませんでしょうか? お教え下さいますようお願い致します。
>>665 コマンドラインでもダメってこと?
まさかレン鯖で実験してたりしないだろうな。
レン鯖だとしたら時間でプロセス切られてるだけだと思うが。
>>668 \d は UTF-8 フラグ付きの '1' (全角) にもマッチする。
[0-9] だとマッチしない。
そうだったのか。まだまだ読み込みが足りんわ。サンクス。 今度は中途半端に\d使ったことが…… orz
>>665 どうしても配列に格納しなけりゃならんのでなけりゃ、以下を試してみないか。
while (<LOG>) {
# 何ぞ処理
}
変数のスコープについて質問。 設定を別ファイルで定義してrequire して使おうと思います。 # 設定ファイル settei.pl $CFG_HOGE=1; $CFG_MOGE=2; 1; #!/usr/local/bin/perl require 'setttei.pl'; print "hoge=$CFG_HOGE, moge=$CFG_MOGE\n"; さて、これでuse strictを付け加えるとCFG_*変数に対してエラーが出ます。 そこで両方の ファイルでmyとしたら設定はプログラムの方では見えないんですね。 こういうことを use strict で行うのはどうすればいいのでしょうか?
行き当たりばったりで strict してもあんまりいいことないよ。 なんてこといってるとどうしょうもなくなるか。 パッケージとか名前空間とかで検索してみな。
674 :
672 :2006/01/14(土) 01:50:37 ID:???
>>673 ありがとうございます。 模索してみました。
トライ1:
すべての$CFG_*を$main::CFG_*にする。 これでコンパイル出来、前と同じ振る舞いになりました。
しかしmain::だらけでうっとうしい。
トライ2:
settei.pl の頭にpackage main;と加える。 main::はsettei.plの中は無し。
こうしてメインで$main::CFG_*と参照すればやはり機能しました。
しかしメインで直に$CFG_と参照するように出来る方法が分かりませんでした。 メインで
my $CFG_* と宣言するとsettei.plでされた設定はメインでは見えませんでした。
う〜ん、よく分からん。
675 :
672 :2006/01/14(土) 02:11:55 ID:???
>>673 こんなのはどうでしょうか。 今までCFG_と付けてたのをやめてsetttei.plは
package CFG;
$HOGE=1;
$HOGE=2;
1;
そしてメインではこれらを$CFG::HOGE, $CFG::MOGEで参照。 これが綺麗かな?
>>672 #--- MyConf.pm ---
package MyConf;
use strict;
use base 'Exporter';
our @EXPORT = qw($Foo $Bar);
our($Foo, $Bar) = (1,2);
1;
__END__
#!/usr/local/bin/perl -w
use strict;
use MyConf;
print $Foo, $Bar;
__END__
私が最近好んで使ってる方法ですが・・・ ◆ config.pl my(%config) = ( 'fuga' => 1, 'hoge' => 2, 'gagaga' => "SEGA" ); sub returnconfig{ return %config; } ◆ main.cgi require 'config.pl'; my(%config) = &returnconfig(); print $config{'fuga'}; わざわざ呼ばなきゃいけない&同じ内容がメモリ内に2つ存在するので効率悪いっちゃ悪いですが・・・
>>677 んなことするくらいだったらタブ区切りの設定ファイルを
読み込んでハッシュに入れた方が管理も楽でしょ
>>677 #--- config.file ---
use strict;
{
foo => 1,
bar => 2,
baz => [ 'a'..'z' ],
};
__END__
#!/usr/local/bin/perl -w
use strict;
my $conf = do '/path/to/config.file' or die;
print $conf->{'baz'}[7];
__END__
>>678 設定ファイルを Perl で書ける。
680 :
672 :2006/01/14(土) 04:43:19 ID:???
>>679 do ファイル; なんて出来ちゃうんですか。 これもなかなか美しいですね。
>>677 #--- 設定
package Setup;
use strict;
sub get{
bless( {
foo => 1,
hoge => 2,
array => [1,2,3]
} , $_[0] );
}
1;
__END__
#!/usr/local/bin/perl
use strict;
use Setup;
my $setup => Setup->get;
print $setup->{'foo'};
print $setup->{'array'}->[0];
__END__
遅くなりました。返信有難う御座います。
>>666 レン鯖です。
やはりタイムアウト的な処理でしたか。
それを避ける方法は御座いますでしょうか?
>>671 open(LOG,"$datfile");
while ( $data = <LOG> ) {
処理
}
close(LOG);
であってますでしょうか?
>682 処理がどんなことしてるかは知りませんが、たかだか 800 行程度でタイムアウト起こすような 貧弱サーバーそのものの利用を考えたほうが良いのではないのでしょうか? >671 個人的には foreach の方が perl らしくて好き foreach my $logline (<LOG>){ 〜処理〜 }
foreachじゃリストに展開するから配列にいれるのと一緒になっちゃうだろ。
おっなるほど。 while を使うのはそゆことでしたか。 自分は 682 さんではありませんが、1つ勉強になりました。 thx
>>683 馬鹿が「perlっぽい」とか言わなくていいから。
もうこのスレに書かないほうがいいよ。
ここwebprog板だぜ
perl で書かれた CGI のソースに、$vout 変数内に a タグで mailto: のリンクが書いてあり、クライアントが リンクを踏むと、メーラーが立ち上がるようになっています。 が、mailto: に subject と body を含めて、かつ body には改行を含めたいのですが、どうしてもエラーになってしまいます。 以下を含める場合、どのように書けばよいのでしょうか ? <持込に関して> ← subject ↓本文 @お名前[改行] @ご住所[改行] @お電話番号[改行] <問い合わせ内容詳細> ソースは ShiftJISになっています。よろしくお願いします。
#!/usr/bin/perl
use LWP::Simple;
$url = '
http://girls.twistys.net/preview/ ';
for ($i=1; $i<=3; $i++) {
$num = sprintf("%03d", $i);
$_ = get($url.$num."/");
s/\w*\d{1,2}\.jpg/push @jpgs, $&/eg;
foreach $jpg (@jpgs) {
getstore($url.$num."/".$jpg, $num.$jpg);
}
}
>>688 このスレの質問じゃねぇし
http://www.ring.gr.jp/pub/doc/RFC/rfc2368.txt mailto:
[email protected] ?subject=%8E%9D%8D%9E%82%C9%8A%D6%82%B5%82%C4
&body=%40%82%A8%96%BC%91O%5B%89%FC%8Ds%5D%0D
%0A%40%82%B2%8FZ%8F%8A%5B%89%FC%8Ds%5D%0D%0A
%40%82%A8%93d%98b%94%D4%8D%86%5B%89%FC%8Ds%5D
%0D%0A%3C%96%E2%82%A2%8D%87%82%ED%82%B9%93%E0
%97e%8F%DA%8D%D7%3E
上を一行に合わせれ
>683 > 処理がどんなことしてるかは知りませんが、たかだか 800 行程度でタイムアウト起こすような その行について、どんな処理をしてるかわからないのに800行で判断する、っていうのはどうかと。 行数で判断するんだったら7万行で、に置き換えてください。そして、タイムアウトするのを避ける方法を教えてください。 なんかコンビニバイト風情が、肉体労働者に「一日働いただけで疲れるのはどうかと」って言ってるのと同じかな
> foreach my $logline (<LOG>){ > 〜処理〜 > } こんな処理を800行「程度」を越える量書くとは…… 俺のレン鯖にいないことを願おう。
タイムアウトを考えてのことなら7万行じゃ少ないんじゃない? せめて70万行とかさ
>>690 ありがとうございます。
実は、同じようにURLエンコードして、おっしゃられたように入れてみたのですが、エラーになってしまうんです。
元に戻すとサーバエラーはでなくなるので、記述の仕方がどこか違うようなんですが
perl の独特な記述の仕方があるのかと思って書き込ませて頂きました。
無限ループ作れば1行ですむ
エラーになると言っておいてエラー内容を書かないのはなんで? 多分、ダブルクオートで囲って @ や % が変数に展開されてるに一票。
データ自体が16から32kbytes程度なら、 別にforeachでも問題なかろう。 それで問題が起きるなら、それこそ鯖が貧弱。
愚直にファイル読み込んでタイムアウトになるならファイルの構造を 見直すしかないでしょ データの量(行数だけでは分からないだろ)も処理の内容も 分からねーのに、何か教えてほしいなんて無理
>>697 馬鹿のプロセス切るのは「鯖が貧弱」
だからじゃなくて管理がしっかりしてるからでしょ。
「問題」じゃまったくないし。
まぁ実際 32kb で切ってたら別の問題だけどね。
お前は書かないほうがいいよ。
おチンチンびろーん ∩___∩ | ノ ヽ/⌒) /⌒) (゚) (゚) | .| / / ( _●_) ミ/ .( ヽ |∪| / \ ヽノ / / / | _つ / | /UJ\ \ | / ) ) ∪ ( \ \_)
>>696 使っているサーバがエラー番号などが出ない仕様なんです。
「サーバエラーが発生しました…」という文章しか出ないので。
確かにダブルクォートで囲って有ります。$vout に代入されているようなんですが…。
その場合はどうすればいいでしょうか ?
サーバで実験しない よいこの約束
>>699 ログが十分に小さければ、foreachとwhileの違いだけで、変わる状況なんて無いね。
仮に、それで問題が起きるなら、プロセス辺りのメモリ割り当てが
かなり小さいぐらいしか考えられない(鯖が貧弱)。
ってことなんだが(苦笑)。
4年書き続けてきたけど、もうだめぽか、ここも。
10万行ループなどMTの再構築に比べればたいしたことない
>>701 他人の管理下にあるサーバで実験しない。自分が動かしているサーバで
実験すれば、そのログを見てデバッグできる。
>>1 に書いてある通り、エラーの内容も貼れないんじゃ質問以前の問題だ。
>>703 4年もいるんだったらスルーすることぐらい覚えろよ。
>foreach( <> ) とか書いてある時点でダメに決まってるじゃん。 それとも4年前からこんな感じだったの?
708 :
703 :2006/01/14(土) 18:36:01 ID:???
>>707 私の書き方は
>>336 を参照してください。
短いファイルなら、ロックする時間をできるだけ短くするように書いてます。
> while( <$FH> ) 普通こうする。読み込みなら文句なしに最強。 > foreach( @FILE ) いわずと知れたKEMT仕様。そして何故か入門者ご用達。 でも頻繁に書き込み(書き込みロック)が必要な場合好んで使う人も。 > foreach( <$FH> ) 謎仕様。ファイル開きっぱなしで配列展開。KEMTもびっくり。
>>709 while は最強っていうか、単に昔から Perl の参考書に多い処理ってだけじゃ?
<$FH> は他のメソッドなり何なりにかわるかもしれんが、 それでも逐次読み出しか一気にメモリに読み出してしまうかに大別できるでしょ 多分。
自分のスクリプトでforeachからwhileに置き換えられるところは置き換えたんですが、その際に1つ疑問が出ました。 リファラのログを取ってて最大件数500件で、501件目が来たら古いリファラは削除して新しいリファラを追加するって処理の時に 現在が何件のログが貯まってるかを調べる時にはwhileだと一旦最後までループさしてカウンタをカウントアップさせて総数を得て、 その次にまたwhileで処理って感じになると思うんですが、 foreachでメモリに負担 なのと whileでDISK I/Oに負担とじゃ他のユーザーも同時に使ってるサーバー上ではどの処理がやさしいんでしょか? 今までforeachしか使ってなくてそれを否定された感があってちょっと自信難儀に陥ってまして助言とか意見があれば参考にしたいと思います。
>>712 おれならメモリに突っ込んでやるけど
テスト環境を用意できるならベンチとってみれば?
大抵のシステム(OS)はファイルにアクセスするときに先読みやキャッシングをしてくれるので Perlで二度アクセスするときのIOは気にする必要は小さなファイルであればいりません。 逆に、プログラムの中でキャッシング的な目的でメモリに読み込もうとすると OS等の低レベルキャッシングとアプリケーションレベルのキャッシングが 物理メモリに配置されることになって、特別な事情がない限り非効率的です。 ちなみにそういうファイルを後から読み込みたいときは専用のモジュールがあります。 Text::Backwords (名前うろ覚え) 今回のケースではメモリ、IOともにもっとも効率がよくなるかと。
途中で書き足したら意味が解らん。ヤバス。 まぁ要は専用のモジュール使えって事で
>>714 File::ReadBackwards ?
メモリ使用量が数百KBレベルの差しかないんだったら、処理が高速な方を選択するよ。 さっさと処理を終らせてメモリを開放させてあげるほうが共用サーバでは重要だし。
普通はメモリに読み込まないほうがメモリ使わなくて高速だからね。 どうもそこらへんわかってないやつが多すぎる。
メモリ数百k無駄遣いしてまで共有サーバーで自分のプロセス優先するのね。 「共有サーバーではそっちが重要」とか思い込み激し杉
>>719 細かい読み込み(しーく)も、鯖に負担かけるんじゃないの?
携帯も初期はそれで問題になったわけだし
良し悪しは良くわからんけど。
>718 お前は全部分かってないな
初心者スレで無理に玄人ぶるのはみっともないね
>>720 システムのキャッシュが破棄されるほどの間隔をおいてアクセスする場合、
そんな長い時間アプリケーションレベルでメモリを確保しとくのは他のプロセスの邪魔。
そしてそのメモリの消費がさらにシステムのキャッシングを圧迫するという悪循環。
普通はアプリケーションレベルでは間欠・逐次的な読み込みでも。
OSがHDなどと協力してアクセスのあったファイルを物理メモリに先読みしてるので
間欠シークは発生しない。
「特定の状況下」で「ハードからソフトまでを知り尽くした」上でのキャッシングは
当然否定しないし、むしろ俺の理解の及ぶ範囲ではないが。
# 窓達だとデフォルトでディスクキャッシュ用メモリの確保量が少ないから効果あるかもね。
>>723 前提がおかしくない?つーか自分に都合良い前提にしてない?
そんなつもりはないんだけれど。 どこが違和感あるのか言ってもらえんと説明のしょうが……
一般にプロセスは太ると死ぬまで痩せない。 理解が充分でない自覚がある場合はメモリを節約するアプローチで概ね間違わない気がするよ。
>>723 の言ってるのは
レン鯖で他のユーザの使用率とかも分からないのに
変に考えて小手先の技使ったって無駄ってことでは。
いまどきI/Oのアクセスをユーザが気にしなきゃならんOSなんて
レン鯖で使ってないよ。
しかも言語がPerlなんだよね。
頻繁に叩かれるスクリプトで、ガバッとメモリ喰うと
そっちの方でディスクにアクセスがかかるかも知れないってのを
心配してるんじゃないのかな。
ともかく変な思い込みでperlのメモリに乗せまくるなと while( <$fh> )も結局は物理メモリのキャッシュから読み込んでる訳で、 遅くないから心配するなと。
遅い遅くないの前に、逐次処理しかできないのって不便じゃない? それで済むならいいけどさ
鯖用途のHDだとHD内部のキャッシュメモリサイズも民生品とは桁違いだったり
>729 便利・不便じゃなくてシーケンシャルアクセスをどうやるかでしょ。 foreach( @ ) も foreach( <> ) もやりたい事は(多くの場合)シーケンシャルアクセス。
スクリプトで一番怖いのが、ファイルロックで プロセスがプロセスキューに溜まる事だと考えてる。 ファイルリードより、スワップの方がコスト高そうだし。 だから、なるべく早くロックを開放することを考えてるよ。 でも、実際そこまで厳しい状態はほとんど知らないし、 そこまで考える必要があるかどうかは分からんけど。
Perl【の】コーディング【を】初心者【に】質問【する】スレ
先に読み込んでおいてからロック解除して後で書き込みロックするってことは 書き込み頻度低いってことでしょ? (そうじゃなきゃ編集衝突するよね?) メモリに展開する必要ないじゃん。
ロックは怖いね。 NASとか使ってると、鯖の構成とか製品によっては フロントの鯖から、ロックファイルが見えるまでにタイムラグがあったりする。
みなさん色々ないけんありがとうございます。 読んでいった感じ、「メモリには優しく」 というのを感じました。 ただまた1つ疑問がw DB 使ってるとして、巨大なテーブルが戻ってきちゃう場合はどうするんでしょ? さすがにこれはしょがないんでしょうか・・・
SQLでLIMITとか使う
>>736 1. DB に処理できることは DB にやらせる
2. 表示なら巨大なものは最初から表示できないから無駄なものは取得しない
いずれでもない場合ってこと?
>736 普段どうやってDBアクセスしてるの? まさか一度二次元配列にぶちこむとかやってないよね?
>739 いやDBは使ったこと無いです(興味あるっちゃありますが・・・) >737,738 たとえば得られたテーブルが (巨大とはいえないけどとりあえず) 5項目程度で1000行だとして、 SQL文で500行目〜700行目だけ欲しいっていうことって出きるんですか? 出来るならそれで解決なんですが ^^;
>>740 > SQL文で500行目〜700行目だけ欲しいっていうことって出きるんですか?
できる
SQLの応答が巨大だからってそれが直にメモリに展開されるわけじゃないから
Perl側に持ってきちゃったら展開されると思うけど
>741 なるほろ。 解決しました thx
745 :
nobodyさん :2006/01/15(日) 00:40:24 ID:xHRm9xcd
>>740 sql limit offsetあたりをキーワードに検索をかけると幸せになれるぞ。
つか、スレ違いっぽいな。
ああスレ違いだageんなバカ
747 :
nobodyさん :2006/01/15(日) 01:05:57 ID:a4Y6+QOP
>>746 そんなつまらん事なら書き込むな、このボケ。つか志ねよ。
Perlについて学び始めの者ですが、SSIをHTML内に埋め込んだ様な使い方ができると知ってふと思ったのですが… -sample.html- <html> <head> <!--#exec cmd="sample.pl"--> こんにちは </body> </html> -sample.pl- print"<title>sample</title>\n"; print"</head>\n"; print"<body>\n"; …これって良いのでしょうか? Perlのパスも記述せず、文法的にも… 一応ちゃんと動作してるんですが、何か物凄く間違ってる気がしてなりません…。
うわぶり返し(; ^ω^)
まだやりたらないみたいですね^^^
自演乙
>750 またおまえ「ら」かよ。いい加減なんちゃってモジュール使いたいがために さるみたいにCGIモジュール直接読み込むのやめろ。な? しかもそれで知ったかで質問にレスするし。 最悪。
まぁ通常の CGI では重たいモジュールの利用を避けるべき、という のは分からなくもない(やりたきゃ自分でサーバ用意して mod_perl や fastcgi でやれってこと)が、それならそれで適切な表現てもんが あると思うがな。
「使いたくないやつは使わない」 それでいいじゃん 〜終了〜
わざわざ車輪の再発明する理由はないけどね。 まぁCGIモジュールしか知らないなら使わないのは正解かもね。
>757 共有サーバーでみんなが右も左も解らず無駄にCGIモジュールをロードしたらどうなると思う?
まだやってたのかよ・・
761 :
nobodyさん :2006/01/15(日) 16:58:32 ID:??? BE:397407694-
レン鯖でCGI動かすような環境でPerl勉強してたら敬遠するようになるだろうなー
762 :
nobodyさん :2006/01/15(日) 17:01:02 ID:??? BE:353252148-
これだから「WebProg板は・・・」って言われるんだよな
先程から拝見していましたが、 結局クエリ読み取るときにはどうすればいいんでしょうか。 教えてください。
ラクダ本て えらい遠回りな
微笑ましいレスだな。
GETしか使わないからURL::Queryに突っ込んでる。
自分の意見を押し通さないと満足しない厨房たち(笑)
いろんな方法が表に出てくるのはいいことだ
sub decode { binmode(STDIN); if($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } } スクリプト書くたびにコレを書いてる マルチプル、マルチパートなんて使わないのでこれで十分事足りてる
>>772 590 549 sage 2006/01/13(金) 12:44:01
>>568 説明すると長くなるから
ttp://perldoc.jp/docs/perl/5.6.1/perlfaq9.podの How do I decode a CGI form?の項を1000回読め。
とほほのコードがどうしてまずいのかがよ〜く解るだろう。
ついでにCGI.pmはpure perlだから読んでみるとよかろう。
もし君が解読しきれなくても本当に正しくフォームデコード
するというのはどんなに大変なことなのかぐらいは解るだろう。
CGI/util.pmのunescapeメソッドを読むだけでも君は
ここで「とほほのコードはWebProg板では普通のコード」
と言い切ってしまったことをとても恥ずかしく思うようになるはずだ。
cgi.pmのマニュアルがよく解らないというのはオブジェクト指向や
参照渡しがよく解ってないからじゃないのかな。
cgi.pmにはcgi-lib.plもどきの関数インターフェースもあるので
Webを漁って探してみてくれ。日本語訳もあるよ。
まあ頑張れ。
>>773 まずレス先をきちんと明示できるように「掲示板の書き方」勉強してみるべき
日本語も不自由でかわいそう・・・
readのエラーチェックとかアホみたいだな エラーチェックしなかったら、どうなるんだってのw
俺仕様で不備が指摘されても開き直る人
反論されて耳が真っ赤でイライラして、必死に言い返す言葉を模索中の>773
いいかげんパラメータ区切り;に改善しろよ。
そして平然を装って書き込む>778=773
>>779 お前は自分の不備を指摘する人間はみんな同一人物だと思ってるのか?
……お疲れさまです。
>778=773=781 落ち着けよwwwwwwwww
具体的にreadのエラーチェックしなかったらどうなるの? 悔しかったら反論してみろよw
wwwww
785 :
773 :2006/01/15(日) 21:59:42 ID:???
俺様にはそんな技量無いので説明できません
786 :
773 :2006/01/15(日) 22:07:51 ID:???
>783 「エラーチェックしなかったらどうなるのか無知な僕に教えてください」だろ。 いくら初心者質問スレだからって人に教えを請う態度ぐらい身につけて下さい。
無知?お前じゃんw
今ここで煽りあってるのは、偉そうにいえるほど効果的なのを組める人ばかりなの?
うん、そうだよ
脳内プロフェッショナルな子供が罵りあうスレと聞いて飛んできました
お手本プリーズ
居ないみたいだし
>>772 がこのスレの限界ということだな。丸く収まったじゃないか。
めっちゃグローバル変数
ちょっと組むぐらいならグローバル変数でも十分なんじゃ?
基本は
>>772 でいいんじゃないの?
突っ込みどころが数箇所あるけど
初心者の俺から見ると普通に
>>772 でいいように見える。
ダメだと言ってる人、折角だから完璧なモノに改造してくれないか?
参考にするから。
そだね
偉そうに言ってる人が
>>772 を改造して結果を出せば「ごもっともな意見です」といえるんだけど
書き直す技量がないから静かになったw
攻撃されてた人カワイソスwww
>>772 の作ったスクリプトに、でかいサイズの動画でも送りつけると楽しいことになりそうだ。
掲示板なら、投稿するリンクを2chに貼るのもいいか。
それと、脆弱性とは私は呼んでないけど、 同じ名前を持つパラメータを送ると、 後から送られたデータに上書きされるよね。
>801 >マルチプル、マルチパートなんて使わない ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
誰か例のモジュールとのDiffとって貼っといて
指摘してるほうも馬鹿ばっか。 子供が意気がるのも道理だな。
>800 そのまえにサーバーでエラーにならない? 全部のサーバーがどんだけのサイズを許可してるかわからんけど受信サイズの制限ぐらいはあると思う
面白そうなのに。 もっと熱い奴ギボン。
>>805 まあ、そうなんだけど、実際にサーバが許してるサイズが分からないしね。
アップローダを見ていると、32M程度なら許していそうな所もあるし、
それでDOS攻撃仕掛けるとかね。
揚げ足鳥じゃなくて、こうすればOKって例出したほうが早いのでは。
それが出せるヤシが残念ながらこのスレには誰一人として存在しない
荒れるのが明らかだから提示しないだけかと
>798から改良ソース出てないし結局は底辺が底辺に教えを乞うスレ
と底辺が解説するスレ
例を出して即荒れるとしか考えが出ないお前のネット人生って(ノ∀`)
814 :
773 :2006/01/16(月) 02:44:44 ID:???
他のスレでも書いてたのか なにもそんな不自由な日本語を色んなところで自ら晒さなくても・・・
816 :
773 :2006/01/16(月) 02:57:22 ID:???
どう解釈すれば俺がそのレスを書いたことになるのかと
それすらも考えられないぐらい日本語不自由なのかorz
パンチ5分の2再来の予感
埋め
埋め
梅
生目
右芽
宇目
鵜雌
(´・ω・`)
浮召
呻
>816 荒らすのはやめれ!
>>807 受信サイズの制限ってよりも、割り当て可能なメモリに制限って感じだな。サーバー側でかける制限は。
んで、そんな制限をかけてないサーバーに1GBほどをPOSTすると、この行で大変なことになる。
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
効率優先で俺様ロジックするのもいいけど、
小手先でやるくらいならモジュール使って安全を買うのもありかと。
ときどき変なスレの伸び方するなぁ。
問題があるでだけで終わらすと、またそれに対して質問がくるよw 先に$ENV{'CONTENT_LENGTH'}で受信サイズを調べろってことですな
1GBも来たらhttpdが先にあぼーんする悪寒
833 :
nobodyさん :2006/01/16(月) 12:57:23 ID:eJEL1pbq
php+pearで
server.php
<?
require_once 'XML/RPC/Server.php';
$map = array('test' => array('function' => 'test') );
$svr = new XML_RPC_Server($map);
function test($param) {
return new XML_RPC_Response(new XML_RPC_Value('OK'), "string");
}
?>
client.php
<?
require_once("XML/RPC.php");
$value = new XML_RPC_Value(
array("test" => new XML_RPC_Value("test", 'string')),'struct');
$msg = new XML_RPC_Message('test', array($value) );
$client = new XML_RPC_Client("/", "example.com", 80);
$response = $client->send($msg);
echo $contents = XML_RPC_decode( $response->value()) ;
では、問題なく動作するのですが、クライアントをperlで
#!/usr/bin/perl -w
use XMLRPC::Lite;
my $rpc = XMLRPC::Lite->new;
my $url = '
http://example.com/ ';
my $contents;
$rpc->proxy($url);
my $res = $rpc->call( "test",{ test => "test" });
print $contents = $res->result;
とすると、Unknown methodになります。
どこが間違っているのでしょうか?
言ってる通りだと思うけど Perl のコードを落ち着いて読む
文字数制限もデコードも一PHPで全部解決!!!!!!!!1111
なんつーか mod_uploader でも使ってろ。
837 :
833 :2006/01/16(月) 16:12:07 ID:eJEL1pbq
rubyで、 require "xmlrpc/client" server = XMLRPC::Client.new( "example.com", "/") begin p server.call("test", 10) rescue XMLRPC::FaultException => err p err.faultString end でも、"Unknown method"ですね。phpがおかしいのかな。
マルチ死ね
sage
sage
sage
sage
sage
sage
>>833 問題なさそうだけど。
それと、サーバーのResponseの部分はこうじゃない?
return new XML_RPC_Response(new XML_RPC_Value('OK', 'string'));
文字変換について質問なのですが、 全角カタカナ・英数字・記号を、半角にしたいと思っているのですが、 どうしても 「(」と「!」が同じように処理されてしまって困っています。 s/!/!/gi; s/(/(/gi; とやると、全角の ( まで、半角の ! となってしまいます。 解決策はございますでしょうか? よろしくお願いします。
CGI.pmを使用して form を作成すると <input type="hidden" name=".cgifields" value="test" /> といった hiddenタイプの.cgifieldが作成されます。 perldoc CGI を読むと、-nosticky プラグマで抑制可能と言うことは書いてあるのですが、 何のために使用されているものなのかわかりません。 この .cgifield は何のためにあるのでしょう?
849 :
848 :2006/01/17(火) 01:17:44 ID:???
スマソ。>848は試しに動かしたらエラー出たので修正版。 use strict; use CGI qw/:cgi/; $CGI::POST_MAX=1024; my $q=CGI->new; my %in=$q->Vars; CGI::Util::unescape for (values %in);
>846 もし、perl5.8.0 以上なら、 use encoding 'shift-jis'; でOK
>848 どうやって斜め読みしたら「モジュールを使って書く」って読めるんだ? 結局は日本語を読めない奴が増えただけかよ
>848 たかがデコードごときにモジュールなんてつかってんじゃねーよ。 モジュールなんていらねーってコトの証明のために書いてんだよ。バーカ
モジュール使わずに、わざわざ同じようなルーチンを手書きする必要って何だろう? 頭大丈夫?
>>846 /i オプションを付けない。
>>847 perldoc CGI に書いてある。
http://search.cpan.org/~lds/CGI.pm-3.15/CGI.pm#nosticky 古いヴァージョンのドキュメントには明記されていないかも知れないが。
>>848-849 CGI::Util::unescape() は渡された文字列を percent-decode して返す
関数なので CGI::Util::unescape for (values %in); では戻り値を捨てて
いるだけ (%in の値は変化しない) し、CGI パッケージに輸出されている
から use CGI::Util; しなくても CGI->unescape() と呼べるし、そもそも
param() や Vars() ではちゃんと percent-decode 済の値を返してくる
から後から unescape() する必要は無い。
use strict;
use CGI ();
$CGI::POST_MAX = 1024; # 1KB
my %in = CGI->new->Vars;
個人的には
>>772 みたいにスコープ無視なサブルーチンはごめん被りたいところだね。
>>854 > ヴァージョン
なんて書くやつはばかです。
> パッケージ
どうせなら、パッケイジって書けばいいのに。
>851 >結局は日本語を読めない奴が増えただけかよ 激しく同意。 851 には >797,>808 が読めないんだからな
> 851 には >797,>808 が読めないんだからな ということにしたいのですね。
>858 それ3つとも俺w 俺じゃ出来ないから出来る人の改良ソースを待ってるわけでですよ。
851=797=808 ? だとすると、851 はモジュール使わない改良ソースを待っているのか?
だから書けないから待ってるとw
モジュールを使う派 vs モジュールを使わない派 の議論だと思ってたが違うのか?
議論するくらいならそこはモジュール使うことにしておいて 空いた時間で他の生産的な事をしろ、ってのがPerlだと思う。
>863 プログラミングはすべてそうだと思うけど…
モジュール使えない環境なので、 どなたか最適なデコード方法教えてください>w<
>863,>864 いや、この板には ・モジュールは重くて邪魔だ。 ・これまでモジュールを使ってこなかったが、困らなかった。 ・実は、オブジェクトがなんなのかわからないんだけど、分からないことがばれると恥ずかしい 等、様々な理由で、モジュール使いたがらない人たちが多いのですよ。
>・実は、オブジェクトがなんなのかわからないんだけど、分からないことがばれると恥ずかしい ソレダ!
普通にそれ というかイマイチ有用性がわからんのもある
無限ループって怖くね?
だって同じことが繰り返されるんだぜ?
単にソースクレクレ君が張り付いてるだけだ。 伝家の宝刀は「このスレは回答者も初心者なんですね」。 この文句には注意な。
> ・モジュールは重くて邪魔だ。 > 等、様々な理由で、モジュール使いたがらない人たちが多いのですよ。 mod_perl とか fastcgi とか lighttpd とか使えないような、 貧乏仕様の ISP 貸し出し環境の人が多いということですか。 それとも、cgi を呼ぶと必ずモジュールのロードからするものが Perl だ とか思ってるんかな。
>>868 自分が必要としていない物の有用性を幾ら説かれても理解には至らんよ。
コードに対する要求レベルは人それぞれで、KENT で充分だと感じる人も
いれば、CPAN にあるモジュールはどれも汚くて書き直したくなる、という
人もいる。この二者が納得するコードなんて書きようがないし、より高い
レベルを要求する事が常に正しいとは限らない。
だから妥協点として、公式マニュアル (perldoc) に書かれている事を指針
にしときましょう、というのが現実的な解。perldoc が難解だと感じるなら
Perl コミュニティ的に「平均」より下。perldoc すら甘いと考えているなら
厳しすぎ。
> より高いレベルを要求する事が常に正しいとは限らない。 そもそもレベルの高低の客観的な評価基準きぼん。 > だから妥協点として、公式マニュアル (perldoc) に書かれている事を指針 > にしときましょう、というのが現実的な解。 それは、どこらへんの「現実」? > perldoc が難解だと感じるならPerl コミュニティ的に「平均」より下。 それは、どこらへんの「Perl コミュニティ」? 「平均」の算出方法も明確にしておいてね。
埋め
齲女
梅
宇目
梅
無限ループってこわくね?
だって同じことが繰り返されるんだぜ?
単にソースクレクレ君が張り付いてるだけだ。 伝家の宝刀は「このスレは回答者も初心者なんですね」。 この文句には注意な。
884 :
nobodyさん :2006/01/17(火) 04:57:07 ID:tDsfmN2q
Perlで掲示板を作成したのですが、表示されるHTMLにPHPを使用したいのでprint等で記述しても、エラーになってしまいます。 Perl内でPHPを使用するにはどうすれば良いでしょうか?
>861,>865 話の流れが理解できているなら、ソースを待っていても、>854 以上のものは出ないことは明白。 待ってても無駄だよ。
>884 「表示されるHTMLにPHPを使用したいので」 のところが意味不明。 いったい何をprint等で記述したか書いてごらん。
いや結果的にCGI.pmに、またはCGI.pmを改良したものに行き着くことぐらいは分かる 「>772をまずはこうやって・・・次にこうやって・・・」であれば>772のどこが悪いってのわかりますよね? ちなみに>772は私がstrictで書く前の代物だったりします (書き直したものはstrictでとりあえず動いてるもののエラーチェックは細かくやってない) ツッコミどころ云々とか言うだけ言って改良案すらも出ないのかなと (出たのはread()に関するとこだけ) ここが上級者スレならスルーはわかるけど・・・ >886 >884は print "echo $char\n"; とか出力して、PHP の echo の動作しない というのが言いたいと思う >884 無理かと perlでPHPのファイル出力してそれをクリックさせるか、CGIとして出力したPHPファイルをperlから呼び出すかぐらいじゃないでしょか? というか、そもそもそんなことやる必要があるんですか? 無駄だと思うのですが・・・
<?php virtual("hoge?cgi"); ?> でPHPに埋め込むのではいかんのか
>>859 ちょwwwさりげなく俺の発言まで自分の発言にするなよw
>>808 はお前が書いたんじゃないだろ。
他のは知らないが。
>884 先に、hoge.php があるのなら、 print qx[php "hoge.php"] phpスクリプトを生成するなら my $php_code='echo "$char\n";'; print qx[php -r "$php_code"]; で何とかなるかもwww
>>887 人に文句付ける前に、お前が改良案出してやれよ。
>>884 やりたいことが
>>887 の通りだとしたら、
出来ないことはないけど、お勧めしない。
PHPはCLI版またはCGI版があることが条件で、
CLI版の場合はあらかじめヘッダを出力してあげること。
# print "Content-type: text/html\n\n";
open(PHP, "| /usr/local/bin/php") or die;
select(PHP);
print while(<DATA>);
close(PHP);
exit;
__END__
<?
echo "hello, world!";
?>
先に文句付けられた方なのですがorz
>>889 あっ、よく見てなかったw
808は私ではない
>>892 知らんがな。
ま、私を煽っても何も出ないよ。
>>772 をちょっと修正
sub decode {
my ( $buffer, %in );
if($ENV{'REQUEST_METHOD'} eq 'POST'){
if( $ENV{'CONTENT_LENGTH'} > 1024 ) { die 'CONTENT_LENGTH error' }
binmode(STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'} eq 'GET'){
$buffer = $ENV{'QUERY_STRING'};
}else{ die 'REQUEST_METHOD error' }
my @pairs = split(/&/, $buffer);
foreach my $pair (@pairs) {
my ($name,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
return %in;
}
895 :
nobodyさん :2006/01/17(火) 09:16:43 ID:nYyzHE1C
現在、携帯用のサイトを作っています。 メールフォームを利用したページを作っているんですが、 記入漏れがあった時、エラーを表示するようにPERLでプログラムしていて 前のページへ戻ると全て入力したものが消えています。 携帯電話でアクセスした場合、メールフォームに入力したデータが キャッシュに残っていないのは仕方のないことなのでしょうか? これはCGIのほうで、どうにかするべき問題ですか? それともHTMLの記述の中でデータ入力したもののキャッシュを 残すように出来るのでしょうか?
記入漏れがある場合は、エラーページを作るのではなくて、 その記入用画面をまた表示する。その際、 ・ページ冒頭で記入漏れがある旨を伝え、それを埋めるように催促する ・正しいデータが送られた部分にはそのデータを初期値として表示 ・正しくないデータの部分にはそれと分かるように印をつけて空欄で表示 として、記入漏れのあるところだけ埋めてもらうようにするのがいい。
897 :
nobodyさん :2006/01/17(火) 09:55:43 ID:nYyzHE1C
>>896 なるほど、引き渡した変数をそのまま利用して、記入漏れの箇所に対してのみ
再度入力を求める形にすればいいということですね。
ただ気になるのが、きっと print ""; を使うことになると思いますが、
例えば名前が 山田 太郎 と入力されたものとして、
年齢が未入力だった場合、どういう記述の方法をとりますか?
名前の箇所の 山田太郎 は正しかったものとして
ただHTMLで文字として表示させて
未入力だった箇所の年齢は 再度入力ボックスを出すという形ですか?
また変数を、こういう形で受け継がせる方法に最適な案などご存知でしたら
ぜひご教授ください
>>897 その辺は好きずき。自分がやるならエラーがなくならない限り
すべての項目を再入力可能にしておくけど。
伸びてると思ったらまたアレか・・いい加減しつけぇよ
ファイルが読み書き込み可能かチェックをするとき、 unless( -e $file and -f $file and -r $file and -w $file ) { print 'NG'; } のようにファイルがあるか⇒ファイルか⇒読み書き込み可能か と全部チェックすべきでしょうか? それとも、-r, -w のみのチェックでも大丈夫でしょうか?
902 :
900 :2006/01/17(火) 12:57:57 ID:???
>>901 下線だけからなる特別なファイルハンドルがあるとは知りませんでした。。。
非常に勉強になりました。
ありがとうございす。
>>898 またもや、項目を入力可能にしておくとは言えども、
前ページで入力したデータが エラーの出たとこ以外には
デフォで入ってる状態で表示させるんですよね?
HTMLでそんなタグありましたっけ?
ある
905 :
nobodyさん :2006/01/17(火) 13:11:38 ID:nYyzHE1C
>>904 <input value=hensuu>
のvalueとこに変数を渡して、そのまま
print ""; 使ってHTML出力してしまえば、前ページで入力したデータが
デフォで入ってる状態になるところまでは分かったのですが、
checkboxやselect typeだと出来なくないですか?
まずはプログラミングの基礎だな。
>>907 <select NAME="県別" SIZE="1">
<option VALUE="北海道">北海道</option>
<option VALUE="青森県">青森県</option>
<option VALUE="岩手県">岩手県</option>
<option VALUE="宮城県">宮城県</option>
<option VALUE="秋田県">秋田県</option>
<option VALUE="山形県">山形県</option>
<select>
前ページで
「北海道」を選んでいたが、 メアドの項目でエラー出たとき
県別のvalueに与えられていた”北海道”のデータを そのまま引き継ぐには
selectedを使って、どうのような方法がありますか?
>>908 s/( VALUE="$form{'県別'}")/$1 selected/;
HTMLのリファレンスを探してこい。
北海道がクエリーに入ってたら北海道の項に selected="selected" 挿入して ユーザーに投げてやればいいでしょ。 何を質問してるのか解らん。
>>909 ありがとうございます。
ただ、その場合は 北海道だけがプルダウンセレクトで出てきて
他の県を選べなくなりますよね?
もし、県別のとこも、エラー出たあとに、他の県に修正できるようにする方法は
ありませんか?
馬鹿すぎww
さすがwebprog板・・
>>910 いろいろ見ているのですが、申し訳ない。
>>911 分かりづらい説明ですいません。
最初のフォーム入力ページでは
<select NAME="県別" SIZE="1">
<option VALUE="" selected>北海道</option>
<option VALUE="北海道">北海道</option>
<option VALUE="青森県">青森県</option>
<option VALUE="岩手県">岩手県</option>
<option VALUE="宮城県">宮城県</option>
<option VALUE="秋田県">秋田県</option>
<option VALUE="山形県">山形県</option>
<select>
というふうに デフォでは "--"と表示されていて”県別”の中身は空ですが、
もし、北海道をここで選んで、他の項目でエラーが出た場合、
表示されるページで ”北海道”がデフォで選ばれてる状態にして
なおかつ、他の県にも修正が効く状態にしておきたいんです。
本当に初歩な質問で申し訳ないんですが、調べてみてるんですが 分からないんです。すいません。
Perlコーディング以前の質問だろ スレ違い、さっさと失せろ
申し訳ない。スレ汚してすいませんでした。 スレ移動します。
>>915 選ばれたものが selected になればよいと言って分かる?
分からなければ制作板で HTML の勉強しといで
>>919 >>915 で、記述ミスしてました。
北海道のところがselectedじゃなくて、 "--"の行がデフォではselectedでした。
こういうやつの書いたスクリプトも結局はアップされて走らされるんだからなぁ 酷使されてる鯖カワイソス
スクリプト全部アップしてみ。 俺が書きなおしてやる。
まず普通に本を読んでこのレベルなら諦めた方がいいと思うね
自分の頭の悪さを責めろ
>>925 今、まとめてます。
ちょっと待ってください。
ありがとうございます
>>925 これがHTMLの部分です。
<HTML><HEAD>
<TITLE>問い合わせ</TITLE></HEAD>
<BODY>
<form action="toiawase.cgi" method="post">
<BR>
氏名:<input size="20" type="text" name="氏名">
<BR>
県別:<select NAME="県別" SIZE="1">
<option VALUE="" selected>--</option>
<option VALUE="北海道">北海道</option>
<option VALUE="青森県">青森県</option>
<option VALUE="岩手県">岩手県</option>
<option VALUE="宮城県">宮城県</option>
<option VALUE="秋田県">秋田県</option>
<option VALUE="山形県">山形県</option>
<select>
<BR>
持ってる免許:
<input type="checkbox" name="免許車" value="CAR">
<input type="checkbox" name="免許バイク" value="BIKE">
<input type="checkbox" name="免許船" value="SHIP">
<BR><BR>
<input TYPE="submit" VALUE="送信">
<FORM></BODY></HTML>
それと<select>タグ、ちゃんと閉じてね。
<FORM>(ry
933 :
929 :2006/01/17(火) 14:40:00 ID:???
上の入力フォームで 名前= 未記入 県別= 北海道を選んだ 持ってる免許= 免許車、 免許バイク を選んだとして、「名前の未記入のみ」に対して もう一度記入してくださいという、画面を出力して出したいんです。 その際には、 県別が「北海道」ということと、免許が「免許車、免許バイク」と分かっているので と吐き出したいんです。 <HTML><HEAD> <TITLE>問い合わせ</TITLE></HEAD> <BODY> 未記入の項目がありました。<BR><BR> <form action="toiawase.cgi" method="post"> <BR> 氏名:<input size="20" type="text" name="氏名"> <BR> 県別:<select NAME="県別" SIZE="1"> <option VALUE="">--</option> <option VALUE="北海道" selected>北海道</option> <option VALUE="青森県">青森県</option> <option VALUE="岩手県">岩手県</option> <option VALUE="宮城県">宮城県</option> <option VALUE="秋田県">秋田県</option> <option VALUE="山形県">山形県</option> </select> <BR> 持ってる免許: <input type="checkbox" name="免許車" value="CAR" checked> <input type="checkbox" name="免許バイク" value="BIKE" checked> <input type="checkbox" name="免許船" value="SHIP"> <BR><BR> <input TYPE="submit" VALUE="送信"> <FORM></BODY></HTML>
>>933 最後は</FORM>の閉じ忘れでした。
すいません
>>934 自分なりにどういうスクリプト書いてみたかもアップして。
アップローダー使ってね。
>>935 >>929 を訂正して 下のように
免許部分を1から3にします。
<HTML><HEAD>
<TITLE>問い合わせ</TITLE></HEAD>
<BODY>
<form action="toiawase.cgi" method="post">
<BR>
氏名:<input size="20" type="text" name="氏名">
<BR>
県別:<select NAME="県別" SIZE="1">
<option VALUE="" selected>--</option>
<option VALUE="北海道">北海道</option>
<option VALUE="青森県">青森県</option>
<option VALUE="岩手県">岩手県</option>
<option VALUE="宮城県">宮城県</option>
<option VALUE="秋田県">秋田県</option>
<option VALUE="山形県">山形県</option>
<select>
<BR>
持ってる免許:
<input type="checkbox" name="免許1" value="CAR">
<input type="checkbox" name="免許2" value="BIKE">
<input type="checkbox" name="免許3" value="SHIP">
<BR><BR>
<input TYPE="submit" VALUE="送信">
<FORM></BODY></HTML>
930 名前: nobodyさん [sage] 投稿日: 2006
935 名前:nobodyさん[sage] 投稿日:2006/01/17(火) 15:01:05 ID:???
>>934 自分なりにどういうスクリプト書いてみたかもアップして。
アップローダー使ってね。
アップローダー使ってね。
アップローダー使ってね。
アップローダー使ってね。
アップローダー使ってね。
>>936 の「免許」の部分は1〜3じゃなくて、全て「免許」で統一でした。
フォームから引き渡した数を
$form{'氏名'} = ""
$form{'県別'} = "北海道"
$form{'免許'} = "CAR,BIKE"
としたときに、 HTMLで下のように吐き出すようなスクリプトを教えてください。
<HTML><HEAD>
<TITLE>問い合わせ</TITLE></HEAD> <BODY>
未記入の項目がありました。<BR><BR>
<form action="toiawase.cgi" method="post"> <BR>
氏名:<input size="20" type="text" name="氏名"> <BR>
県別:<select NAME="県別" SIZE="1">
<option VALUE="">--</option>
<option VALUE="北海道" selected>北海道</option>
<option VALUE="青森県">青森県</option>
<option VALUE="岩手県">岩手県</option>
<option VALUE="宮城県">宮城県</option>
<option VALUE="秋田県">秋田県</option>
<option VALUE="山形県">山形県</option>
</select> <BR>
持ってる免許:
<input type="checkbox" name="免許" value="CAR" checked>
<input type="checkbox" name="免許" value="BIKE" checked>
<input type="checkbox" name="免許" value="SHIP">
<BR><BR>
<input TYPE="submit" VALUE="送信">
<FORM></BODY></HTML>
>>935 スクリプト自体はまだ、出来あがってはいませんので
アップできませんが、上のような形でHTMLを吐き出してくれる方法だけでも
教えてもらえませんか?
>>939 教えてもらえません。
お前の屑スクリプトが動くところがみたいんじゃなくて、
お前がそれ相応の努力をしたかどうかがみたいんだ。
だから書きかけでもうpが先。
氏名のところが記入済みのときは、ただ単に下のように inout valueのところに名前の変数をデフォで表示させておけば 問題ないと分かったんですが・・・・ $NAME=$form{'氏名'}; print " <HTML><HEAD> <TITLE>問い合わせ</TITLE></HEAD> <BODY> 未記入の項目がありました。<BR><BR> <form action=toiawase.cgi method=post> <BR> 氏名:<input size=20 type=text name=氏名 value=$NAME> <BR> 県別:<select NAME=県別 SIZE=1> <option selected>--</option> <option VALUE=北海道>北海道</option> <option VALUE=青森県>青森県</option> <option VALUE=岩手県>岩手県</option> <option VALUE=宮城県>宮城県</option> <option VALUE=秋田県>秋田県</option> <option VALUE=山形県>山形県</option> </select> <BR> 持ってる免許: <input type=checkbox name=免許 value=CAR> <input type=checkbox name=免許 value=BIKE> <input type=checkbox name=免許 value=SHIP> <BR><BR> <input TYPE=submit VALUE=送信> <FORM></BODY></HTML> ";
>>940 わかりました。
がんばってみて、うpってみます
>>894 の $buffer のスコープを狭くして参照を返してみる。
sub decode {
my @pairs = split(/[&;]/, do {
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
if ($ENV{'CONTENT_LENGTH'} > 1024) { return undef; }
my $buffer;
binmode(STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
$buffer;
} elsif ($ENV{'REQUEST_METHOD'} eq 'GET' or $ENV{'REQUEST_METHOD'} eq 'HEAD') {
$ENV{'QUERY_STRING'};
} else { return undef; }});
my %in;
foreach my $pair (@pairs) {
my ($name, $value) = split(/=/, $pair, 2);
$name =~ tr/+/ /; $value =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$name} = $value;
}
return \%in;
}
とりあえず KENT は参考にしないでほしい
>>945 クエリーストリング付きのURIにPOSTでデータ投げたときってどうなるの?
CGI の勉強をしたいんですが、KENT ってホームページで勉強してもいいですか?
www突っ込むところそこじゃないだろ。
やらなくても解るがな。
952 :
944 :2006/01/17(火) 16:11:28 ID:???
すいません、自分にレスが来ているのかどうかさえ、 文面から判断できません。
>>944 他行ったら? たぶんアンタは2ch向いてない。
>>952 2ch で勉強しようと思っているのならそれはやめた方がいい
今の君は付け焼き刃でどうにかなるレベルじゃない
もっと時間を掛けて、身銭を切って何冊か参考書を買うことが必要だ
>>952 一応書いてる。まぁ他の作業の暇にだから夕飯食い終わった後にまた来てみ。
>>956 ありがとうございます。
了解しました。
('A`)
>>960 無駄な議論かどうかって、どう判断するの?
962 :
nobodyさん :2006/01/17(火) 18:43:33 ID:??? BE:463642676-
しーっ!
うむ。 無駄な議論の定義を作っておかないとね。
フォームで複数選択可能な項目が有る時には同じ名前で違った値が入力されますが、cgi-libでは $in{$key} .= "\0" if (defined($in{$key})); の様にしてセパレータを使って複数の値をセットしてました。 cgi-libを見るまえに同じことを自分で書いてたのですが、自分のソースは\0ではなく\tを使ってたました。 \tより\0を使ったほうがいいのでしょうか?
>>963 無駄な議論の定義は今回は必要ないだろ。
CGI.pm と query の処理関係の、質問以外はそっちに誘導してしまえばいいのだ。
ここは質問スレ。
>>965 初心者スレだから、query処理の質問に対する
答えはCGI.pm使えで良いんじゃない?
それに満足できない人はそっちのスレへ誘導と。
流れを読む限りCGI::Minimal派と自作派でCGI派は居なかったはずと訂正しとく。 あと初心者には組み込み関数のほうが使いやすいと思われ。
968 :
nobodyさん :2006/01/17(火) 19:28:31 ID:tDsfmN2q
SSIでブラウザごとに違うページへ飛ばすプログラムを作成したいと考え、index.shtmlへアクセスした際に 環境変数でブラウザ等を判別し、それぞれ別のファイルへ飛ばす方法を検索したのですが、見つける事ができませんでした。 CGIなら Location:各ページのURI で出来たのですが、SSIではどうすれば良いでしょうか?
>>965 何を「無駄な議論」にするか定義しておかないと、
初心者の質問を装って面倒臭い話始めちゃうぞ。
玄人から見るとこのスレが無駄 ってなっちゃうから何が不要なのをハッキリと
無能なスクリプトしか書けない人間しか来ないんだし、 WebProg 自体が不要じゃね?
今時は Ajax でほげるので、form の中身をまとめて post なんて 間抜けなことはしない。
>>973 Ajaxを使うとすると、選択する度にサーバへ情報を送る訳ですね?
となると、情報の保持にはセッションを利用するんでしょうか。
>>975 ありがとうございました。
全然見たこともないような書き方をしていたので
びっくりでした。
今日はもう寝るところでしたので
明日の朝また見直したいと思います。
お疲れ様でした。
>>974 ふつーに考えて、何らかのセッションを維持しなければそういうことできないよね。
> 今日はもう寝るところでしたので > 明日の朝また見直したいと思います。 結局、こういう人間が質問してるんだよね。
寝る時間さえ自由に決めさせてくれないスレはここですか?
高々数百kのクエリー受け付けるのに何倍もメモリー使う俺関数は神だな。
今時メモリーなんて無限にあると考えてもよいのでは?
メモリよりはプロセス数の方が怖いね
メモリのほうが恐いよ。
搭載メモリに応じて走らせられるプロセス数が決まる訳で、 そいうこと考えられない人間はエスパーにしか見えないんだが
うーん。どうだろ。 ほとんどの鯖では、プロセス数を設定で抑えてるからなぁ。
意味無い議論な上に極端だなぁ。 メモリがいくらあってもプロセス数の制限があっても、 処理が遅かったら微妙だしな。 バランスよ。バランス。 そんな事もわからんのか。
藻前の脳内常識が通用するとは限らんよ。
言い切らない辺りに自信のなさを感じますね
ガキじゃないってこと
「自身がある」ならば、「言い切る」ということにしたいんだろうか。
みんな次スレを忘れてないか。 漏れが建ててくる
次スレなんて必要ないのでは?
通用するとは限らない=通用する場合もあるし、しない場合もある 否定になっとらんね。
>>996 > 否定になっとらんね。
何を否定?
意味不明ですね。
>脳内常識 思いっきり否定してるなw
>>990 さんは華麗に揚げ足取りしたつもりでした。
へー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。