初めに→「perl」その物のスレです。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは
>>2-10 にまかせた。
4 :
2,3 :03/01/11 13:55 ID:???
他、なんかある?
5 :
1 :03/01/11 13:57 ID:???
7 :
nobodyさん :03/01/11 14:01 ID:NBoN4jVX
use CGI を使ってるんですが、 フォームで <INPUT type="hidden" name="id" value="test_id"> というタグがあるので、これを受け取るのに use CGI; my $q = new CGI; $q->param('id'); で受け取れるんですが、これそのものを正規表現にかけたいんです。例えば 例えば、@list にIDのリストが入ってるとして、 if(join(',',@list) =~ /$q->param('id')/){ print "あなたのIDはリストに含まれています!"; } こんなかんじで。 でも正規表現内に $q->param('id') な記述が許されないようなので my $a = $q->param('id'); if(join(',',@list) =~ /$a/){ print "あなたのIDはリストに含まれています!"; } と書かなくてはならない、これがめんどくさい! どうにか1行で書けないもんでしょーか?
>>前998 そうですね。 正確に測ったわけではないですが、異常なほど数値が片寄ります。 例えば、1-100までの整数が出るようにした場合、数回連続で同じ数字を取得したり、 同じような条件下では絶対に出ないような数字もあります。 >>前995さんが言っていたようなOSから取得するとかではなくて、 多少処理や記述が複雑になっても良いから、独自にランダム性の高い処理を作っている人はいないのでしょうか? 例えば、初期値の法則に「時間」を組込んでしまうと、 CGIの1アクセスで100の数値を取得した場合、ランダム性のカケラも見えず、 同じ数字がわんさか出ます。
10 :
nobodyさん :03/01/11 14:08 ID:2PtCQo+x
>>7 その処理は普通、grepを使って、こうする。。けど回答になってないな。。
if ( grep { $_ eq $q->param('id') } @list ) {
11 :
9 :03/01/11 14:15 ID:???
前スレ993の文をこちらにコピーしておきます 【perl】 ランダムから求められる数値が片寄ってるような気がしてなりません。 ランダムを取得する時、必ず直前に以下のような記述を置いているのですが、 正確な意味も分かりません。 (昔、どこかで見たのを写したのだと思います) srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`); 質問1 上記はどんな初期値(?)を作成してるのでしょうか? 質問2 とても効率が良く、数値が片寄る事を感じさせない記述を教えて下さい。 皆様はランダム前にどんな記述をおくのでしょうか? イロイロ教えて下さい。 また頭が弱いため、見ても理解出来ないと思うので、どのように求めているのかも簡潔に教えてくれると嬉しいです。
>9 それってさ、srandを複数回行なってない? srandは1回行なえばそれでいいんだが。 ソース出して。
一応、例として。 悪い例: foreach(0 .. 100){ srand(time); print rand(100); } 正しい例: srand(time); foreach(0 .. 100){ print rand(100); } srandは「乱数のスタート位置を決める」もの。 randは「スタート位置から決められた順番をなぞる」もの。 srandを何回もやれば、スタート位置が毎回戻るから、同じ結果にしかならんぞ。
14 :
9 :03/01/11 14:23 ID:???
ちょいとソースは…無理(一万行近くあるので) えと、実はランダム取得前に何度も置く事が多いです。 srandしてからrandみたいな。 しないほうが良いのでしょうか? また、しない事もありますが、それでもやっぱり片寄ってきます。 例えば、RPGを作っていて、ランダムにストーリーが分かれるのですが、 プレイヤーの話を聞いてみるとみんな似通った結果になる事が多く、綺麗に分かれていません。 その「ランダムによって分ける」と言う作業自体は非常に単純な処理にしてあるので、 おそらく自分ではあくしていると思います。 で、どんな角度から考えてもやはり原因は「ランダム」が「ランダムじゃない」と言う事にあるようです。
15 :
9 :03/01/11 14:25 ID:???
16 :
nobodyさん :03/01/11 14:30 ID:2PtCQo+x
srandを2回以上やるのは禁止。 srand、randで、1方向ハッシュみたいに使うのも禁止。 それは他に移行してもそのまま動くのか?と。
17 :
nobodyさん :03/01/11 14:32 ID:P/LXfaGE
種が同じなら同じ花しか咲かない
18 :
nobodyさん :03/01/11 14:34 ID:2PtCQo+x
で、種から花を作る、そのアルゴリズムは統一されているのか。ということ。
あ。自分は関係なかったかも。。
20 :
えせカミ :03/01/11 14:38 ID:???
>>7 if(join(',',@list) =~ /$q->param('id')/){
↓
if(join(',',@list) =~ /${\$q->param('id')}/){
でもこの書き方が好きかい?綺麗かい?
>14 srandは2回以上やっちゃいけない。 「同じ乱数を複数回使いたい」とか特殊な状況でもない限り。 どうしても2回以上srandをするなら、種も変えるべき。 基本的にはスクリプトの頭で1回だけsrandすればいい。 Perl5以降なら、それすらも必要ない。
22 :
9 :03/01/11 15:13 ID:???
では、ずうずうしいようですが 品質の良い種を皆様から多数頂けないでしょうか? 種の内容も簡単に説明してくれると嬉しいです。
>22 品質のいい種は前スレで出てたあれ。 理由は今のあんたに説明してもわからんだろ。 ちゃんと覚えたいなら駱駝本(プログラミングPerl)買え。
24 :
9 :03/01/11 15:18 ID:???
あと、以下の記述は俺が使う条件下ではあまり品質が合っていないようです。 srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`); 今の一番の問題は時間です。 同じ時間だから似たような結果になる、と言うのを避けたいです。 同じ条件下で1000回以上「1-100」の整数を求めた時、 「連続して同じ数字が出ない」 と 「平均的に全て出てくる」 と言う条件を満たしたのがグットです。
25 :
9 :03/01/11 15:19 ID:???
>>24 > 「連続して同じ数字が出ない」
どんな乱数でもこの条件は満たせないと思うんだがな。
任意の二数を取り出して同じ数字な確率ってほんの1/10000でないかね?
>>26 言ってる事が矛盾してないか?
それと1/100だと思うぞ。
>>27 あ、1/100だわ。スマン…寝ぼけてたようだ。
矛盾はしてない気がする。千なり一万なり生成して連続して同じ数字が出ない
様な乱数系列ってほとんどあり得ないと思うんだが。
29 :
9 :03/01/11 15:32 ID:???
>>26 と28
ええと、
srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
の記述では、例えばCGIでPERLを使い、1アクセスで1つの数字を求めたとします。
ですが、連打して求めてしまうと同じ数字が返って来る事が非常に多いのです。
当たり前と言えば当たり前なんですが、これをなんとかしたいです。
30 :
26 :03/01/11 15:37 ID:???
スマン。とことんまで寝てたらしい。やっと理解した(苦笑) 種ねぇ…その記述よりいいのなんておもいつかんわ。
32 :
9 :03/01/11 15:52 ID:???
>>31 アイディアありがとう御座います。
でも、多くの人に連打される状況下にあるのでちょっと難しいかも…
で、ちょっと考えてみました。
最後のワガママです。
------------------
srand(ここを適当に考えてほしいです);
$aaa = rand;
srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
↑この中に$aaaを追加したいのですが、記述の意味が俺にはイマイチ理解出来ないので考えてほしいです。
------------------
以上。
すごくワガママですが、お願いします。
33 :
9 :03/01/11 16:27 ID:???
そいや書き忘れました。
>>28 >>同じ条件下で1000回以上「1-100」の整数を求めた時、
>>「連続して同じ数字が出ない」
↓
>矛盾はしてない気がする。千なり一万なり生成して連続して同じ数字が出ない
>様な乱数系列ってほとんどあり得ないと思うんだが。
そうですね。
例えば、1回で1/100になるのだから、
1000回やると
(1/100)×(1000)
って事になります。
結果的に、1000回ループした場合、同じ数字が連続して出るのは「10回前後」と言うのが
もっとも効率が良いランダムって事になります。
そして、それが全然満たされていないのが現状です。
これを言いたかったのです。
>32 それが意味ないってまだわからないか? 最初のsrandが変わらなければ、$aaaも同じ数字にしかならない。 記述の意味が理解できないってなら、自分で検索するなり何なりで調べろ。 駱駝本買うって言ったなら買って読め。 いい加減しつこい。
よく、 CGI スクリプトで srand(time ^ $$) としているものがありますが、ヒット回数が非常に多い場合、 次に実行される時点で時間とプロセスIDがそれぞれ1ずつ増加することになるケースが考えられます。 このようなケースでは、結果 x^y == (X+1)^(Y+1) ということになり、1/3 のかくりつで同じ数が発生することになります。 引用:CGI&Perlポケットリファレンス P.223 TIPSより (藤田郁、三島俊司著 技術評論社 発行 ISBN-4-7741-0755-7 C3055) 要因はこれのようですね。
$$ 毎に種を生成する。 っていうのはどうだろう? if ($$%10 == 0) { srand( time + $$); } if ($$%10 == 1) { srand( sin(time + $$)); } if ($$%10 == 2) { srand( cos(time ^ $$)); } みたいな。
>>34 いいえ?
少なくともダブルクリック時には変わりますよ?
それと、統計を取ったわけじゃわりませんが、
同じsrandを繰り返しても必ず同じ結果になるわけではありません。
>>32 のは分岐点を増やす意義があります。
あと、実際の記述を1つも書いていないのにしつこいとははちょっと…。
答えたくないのなら無視していればどうかと…。
>>35 そうです。
俺のもだいたい1/3くらいでした。
そこで提案したのが
>>32 なのですが、実際の記述方法が分からないため、
2ちゃんねらーの方々の知恵を借りようと思ってやってきました。
38 :
9 :03/01/11 16:49 ID:???
>>37 も自分です。(すみません)
>>36 $$とはなんでしょうか?
すみません頭弱くて。
連打アクセスでもランダム性が保持出来るのなら、ありがたくちょうだいいたします。
ぷ
>>37 の突っ込みで思わず笑ってしまった。
>>34 記述が書けないならレスするな。
1回も答えてないのにしつこいって…。久々にワラタよ。
>>38 「$$」は、特殊変数です。
んーPerl関連の書籍とかには載っているかと思うけれど(苦笑)
いわゆる、PID、自身のスクリプトがPerlで実行されたときに付与される起動プロセス番号です。(UNIX系のみ?)
>37 統計を取らない。 実際の記述を出さない。 だから嫌われるのがわからんのか? 1万行あるってなら、txtにしてアプしろよ。 そもそもお前は聞いてばかりで自分で調べようとしてないじゃないか。 まずはsrandやrandが具体的にどういう効果を持っているかも未だに理解してないんだろ? これだけやりとりして、その間、お前は聞くばかりで自分で調べようとしていない。 1から10までここで聞く気か? >同じsrandを繰り返しても必ず同じ結果になるわけではありません。 同じ定数なら確実に同じ数値が返る。 お前が言ってるのは、時間などの変化のある数字を使っているから、 srandに渡される数値が変わって、結果的に異なる初期化方法になってるだけ。 つまり、最初のsrandで確実に異なる数値を渡せるなら、その後に$aaaを 使ってsrandしなおす必要はないだろ? 最初のsrandが同じになる → $aaaも同じになる → 2度目のsrandも同じ結果になる 最初のsrandが異なる結果になる → 2度目のsrandをする必要がない これくらい消防でもわかるわ。 今まで答えて損した気分だ。 宿題は自分で考えな。
>39 結構レスしてると思うんだけどね?
43 :
9 :03/01/11 17:05 ID:???
>>39 いえ、別に答えてないとまでは…
>最初のsrandが同じになる → $aaaも同じになる → 2度目のsrandも同じ結果になる
ええと、
連打アクセスでも最初のsrandは同じになるのでしょうか?
分かりました。
srandを調べてみます。
>>40 ありがとうございます。
その方法を一度テストしてみますm(__)m
44 :
9 :03/01/11 17:09 ID:???
45 :
yani ◆saNSktNEdQ :03/01/11 17:14 ID:umfOb+ix
今ちょっと毎秒20hitを模擬してみたが, time ^ $$ ^ unpack "%L*", `ps axww | gzip` は何回やっても重複しなかったな。 (毎秒20回以上になると、俺のボロマシンでは重くて「同時」にならない) ただ、ps とか gzip 起動しているからその分、ちょっとプロセス数を増やして行くと 、Resource temporary unavailableがすぐに出る。 そのときに件の式がどういう挙動しているかはよく分からない。 Perl5自身に任したほうが良いような気がするな。
>43 言い方悪かったな。 要するにお前は、同じ乱数が出るから困ってるんだろ? その原因はsrandであると。 同じ順番で乱数が出てる時は、srandが同一である可能性が高いんだよ。 >35さんの言うやり方なら、1/3で同じってことか。 お前さんがやりたいのは、その「1/3の確率で同じになった時に、 別の乱数になるようにしたい」って事じゃないのか? つまり、その時点ですでにsrandは同じわけだよな。 だとしたら、$aaaに出てくる数字も同じ、その後のsrandも同じになるわけ。 わかる? 連打アクセスの場合はプロセスIDが異なるから同じにならない事がある。 ただ、それでも同じになる場合があるから困ってるんでしょ? 本気で覚えたいなら、srandとrandの事を自分できちんと覚えるしかないのさ。 検索なりなんなりでそういう説明ページ探したか? そういう努力をしようという姿勢が見えないって事。 こっちだってsrandやrandの説明からまでは付き合えんって事さ。 そこまで回答者に説明させる気? それくらい自分で調べてから聞いてくれと。 最後に俺の駱駝本に載ってたやり方を参考までに載せとく。 srand(time ^ ($$ + ($$<<15))); 場合によるが、Webサーバー上のCGIであり、同一人物の同時アクセスを想定しないなら、 IPアドレスなりUSER_AGENTなりを式に組み込む手もある。
>今ちょっと毎秒20hitを模擬してみたが ってどうやってやるんですか? F5連打じゃないっすよね?telnet?専用クライアントでもあるんでしょうか?
48 :
yani ◆saNSktNEdQ :03/01/11 17:31 ID:85OU0JtJ
>>47 子プロセス20個起動して、ある時刻に一斉に件の式をprint
も、もうちょっと具体的に知りたい。 >子プロセス20個起動 がすでにわからん。これはどういうところ勉強すればいいんでしょう?
>>9 っていうか掲示板なんだから、自分以外にも利益がある(可能性がある)
ことを書けや。。出来ないなら出て行け。
はっきり言わせてもらうと、おまえより賢いやつはこの板には沢山いる。
自分の間違いに気づけ。そして、勘違い発言を増殖させるな。
52 :
nobodyさん :03/01/11 20:48 ID:L83LO6Ji
正規表現で、例えば<B></B>でくくられた部分をとってくるにはどう書けばいいでしょうか? 例えば、"<B>hoge</B><B>fuge</B>" っていうので、hogeってとこだけをまず取りたいのですが、何も考えないで書くと hoge</B><B>fugeが取れてしまって困っています。何か上手い書き方があったら教えて 下さい。 意味不明だったらすみません。
>52 正規表現に最小のマッチングというのがある。 調べてみ。 それよりも"<B>hoge<B>hage</B>hige</B>"という文字列だったらどういう処理にするつもり? それによってかなりやり方が変わるから。
>>53 ありがとうございます!
調べた結果、?を一文字つけるだけで解決できました。
入れ子構造になってるのは・・難しそうだから考えないようにしようかなと思ってます・・。
55 :
54 :03/01/11 21:02 ID:???
あ、でも、"<B>hoge<B>hage</B>hige</B>"というものに対して、 hoge<B>hage</B>higeが取れれば、やれることが広がるので、 上手く書く書き方がありましたら教えて頂けると嬉しいです。
>それよりも"<B>hoge<B>hage</B>hige</B>"という文字列だったらどういう処理にするつもり? タグでネストは無いと思いますが…。 # 閉じ忘れはあるかもしれないですが。
>>56 <TABLE>の中に<TABLE>とか、<DIV>の中に<DIV>とか。
>>57 おー、なるほど。
<div><p><div></div></p></div>とか、ありですね。
59 :
9 :03/01/11 21:54 ID:???
えと、 イロイロ調べた後に実験しました。 $$は、別に混雑してようとしてまいと関係なく、連打なら「1づつしか増えませんでした」 まだしっかりとsrandの性質を理解出来てないのかもしれませんが、やはりこれに原因があるのではないかと考えます。 で、皆様の書き込みを参考に以下の記述を作ってみました。 ----------------- if ($$ % 2 == 0) { srand(time); } if ($$ % 2 == 1) { srand($$); } #↑1づつ増えるた時に困るのだから、奇数か偶数によって変える。 $rand_a = int(rand(9999)); $rand_b = int(rand(9999)); $rand_aa = (time - $rand_a); $rand_bb = ($$ + $rand_b); #↑「time」と「$$」は、時間が近いととても似た数字になるため適当に変える。 srand($rand_aa ^ $rand_bb ^ unpack "%L*", `ps axww | gzip`); #最後にこれを置いて完成。 --------------------- まだこれのテストはしてませんが、取り敢えず完成したので報告しに来ました。 また、問題な点があれば教えて下さい。
>55 それはまた難しいぞ。 "<B>hoge<B>hage</B>hige</B>fuge</B>"の時はどうするかとか。 "hoge<B>hage</B>hige"でいいのか、"hoge<B>hage</B>hige</B>fuge"まで取るべきか。 >56 プログラマーはユーザーがどんな意表をついた入力をしても大丈夫なようにシステムを考えないといけない。 そういうところで気を抜くとセキュリティホールができたりしちゃうからね。
すべての入力を、例外なく処理できないならば、それはバグである。 みんなが、まともなブラウザ、まともな思考回路を持っているとは限らない。 あと、一番忘れやすいのは、$ENV{HTTP_*}は汚染されているということ。 $ENV{HTTP_USER_AGENT}とかは特に。これをタグの無効化をせずにHTMLでの 出力に使ったりすると、クロスサイトスクリプティングちゅーやつが発生する。
>>59 いやあのそのどのこの、srand を2回以上やっても(以下略^^;)
> if ($$ % 2 == 0) { srand(time); }
> if ($$ % 2 == 1) { srand($$); }
> #↑1づつ増えるた時に困るのだから、奇数か偶数によって変える。
1秒間に3回以上アクセスがあると、$$%2 == 0 の時は重複しまつ。ので却下(^-^*)
そもそも、time ^ $$ に問題があるので、この部分をえろえろと変えてみればどないでし?
例えば・・・
my $pid = $$;
srand((time & 0xFFFF) ^ (($pid << 8) | ($pid & 0x00FF) ^ 0xFFFF));
とか。
(65536通りの種。同位置時刻に複数アクセスがあっても、PIDを奇数と偶数バイトを入れ替えてからビット反転しているので、連続した種は256以上のアクセスが来たとき以外は出てこない。ん?あってるのか?)
ところでPerlに、ビットのローテートできる演算子ってあるのかな?無いのかな?
>>62 びっとのローテートは >> << だよん。
$unko
>>1 で、1さんに……じゃなくて、$unkoを右に1ビットシフト。空いたビットは0で埋め立て。
しかしまぁ、以前にも「完全な乱数は無理」ってレスがあったはずなのに、しつこいのがいるね。
コンピューターの作る乱数なんぞ「計算」で求めてるにすぎないのだから、いくら種を工夫した
ところで、分布に偏りができてしまうのは仕方が無い。
64 :
9は必ず読むこと。 :03/01/12 00:07 ID:pN++dQ77
/dev/randomを、Perlから使いたいなと思ってちょっと調べてみた。一番簡単な方法は、
Crypt::Randomになるのかな。他にもあるかも。
>>9 にはこれをseedに使うことを勧める。ゲームのためにコストのかかる乱数
を作るのは、もったいないと思うけど。
それに、おそらく標準のrand()の線形合同法(?)の周期も気になるだろうから、
Math::Random::MT(究極の擬似乱数生成のモジュール)も併せて使っていただきたい。
FreeBSDなら、rndcontrolでIRQを設定しておかないと、/dev/randomのエントロピープール(?)
がなかなかたまらないから注意すること。
>>64 open(MD5FILE,">$md5datefile");
my $data = "";
sysopen(RANDOM, "/dev/random", O_READ) || die "cannot open /dev/random $!\n";
sysread(RANDOM, $data, 16);
close(RANDOM);
print MD5FILE "$MD5DATE<>$data";
close(MD5FILE);
$md5->add($data);
bbs.cgi(2ch) での ID 生成ルーチンの中で、こんなことをやっているのがありますた。
参考程度に。
66 :
nobodyさん :03/01/12 00:30 ID:pN++dQ77
あぁ。Math::Random::MTはseedに32bit以上の数を渡す事ができない・・ これでは満足できないでしょ。
古いし、使った事ないけどMath::TrulyRandomはどう?
perl式のお試し用read-eval-print。 rep.plとして作成 ----- while(<STDIN>) { print eval($_)."\n"; print $@ if ($@); } 1; ----------- これで perl rep.plで起動し 試したい式を入れれば評価結果が表示猿。
>>58 > <div><p><div></div></p></div>
pはインライン要素のみ
とか、揚げ足とってみる。
70 :
nobodyさん :03/01/12 11:57 ID:oJAGmVM6
my $a = 'これはグローバル変数です'; ってやったら、この$aは暗黙で $main::a と扱われるんだよね? じゃあ my $a = 'グローバル変数です'; for(0..10){ my $a = 'これはfor内のローカル変数です'; } ってやった場合、もちろんこのふたつの$aは区別されると思うけど、 forの外にあるのは $main::a じゃあfor内の$aは何? これも暗黙のうちに $main::a になるの?
71 :
nobodyさん :03/01/12 12:19 ID:tUI5W5YD
画像アップ掲示板を改造しているのですが、 フルパスからファイル名だけを取り出す方法が分かりません。 OSによって:\/など区切りが違いますけど どうやって取り出せばいいのでしょうか?
>>70 myで宣言した変数が$Package::varnameで参照できるの??
初耳だYO
73 :
nobodyさん :03/01/12 12:25 ID:eJ8Igs3E
>>71 $fullpath = 'c:\hoge/hoge:hoge\aaa.ccc';
($file) = $fullpath =~ m|([^:\\/]*$)|;
print $file;
76 :
nobodyさん :03/01/12 12:54 ID:pN++dQ77
77 :
9 :03/01/12 12:57 ID:???
>>64 〜
イロイロありがとうございます。
モジュールについても調べて(探して)みてます。
(英語に苦戦してますが…)
それと
>それに、おそらく標準のrand()の線形合同法(?)の周期も気になるだろうから、
これについても、testしてみましたが、そのようです。
わざわざご丁寧にありがとうございました。
日頃からほとんどモジュールを使わないのに加えて、複数調べているので理解に時間がかかりそうですが、
解決できそうな感じです。
とても勉強になりました。(イロイロな意味で)
78 :
71 :03/01/12 13:01 ID:tUI5W5YD
>>74 ありがとうございました。
無事取得できました。
>>63 > $unko >> 1 で、1さんに……じゃなくて、$unkoを右に1ビットシフト。空いたビットは0で埋め立て。
いやあのそのそれだと「ビットシフト」なのではないかと(苦笑)
01001011 RightRoll.b ===> 10100101
なんて具合になるのがあればと(苦笑)@キャリーフラグが立ってもよい(笑)
> ところで、分布に偏りができてしまうのは仕方が無い。
それをどれだけうまく誤魔化せるかが思案のしどころですヨね(^-^*)
>>77 エロエロがんばってくらさいです(^-^)
80 :
nobodyさん :03/01/12 13:28 ID:eJ8Igs3E
>>73 すみません。
マルチポストってマナー違反ってしりませんでした。
ごめんなさい。
81 :
nobodyさん :03/01/12 13:34 ID:5wjAToqi
82 :
58 :03/01/12 13:54 ID:???
>>69 まったくその通りでした。
<div><div><div></div></div></div>
<div><div><p></p></div></div>
等が正しいです。
84 :
63 :03/01/12 22:24 ID:???
>>79 うわっ!おっしゃる通り、シフトとローテートを勘違いしてますた!(恥ずかしい…)
ビット演算子を駆使すればローテートは実現可能だけど、あんまりスマートじゃない。
Perlにもキャリーフラグがあればなあ(w
85 :
nobody :03/01/13 11:10 ID:CGEjRZ/e
初めまして。 質問させてください。 @a,@b,@cという3つの配列があり、全部の値をどの配列から渡されたかわかるように 1つの関数に渡したいのですが渡し方がわかりません。 なお、配列の要素数は場合によって変動します(0〜20程度)。 どなたか、上手い方法をご教授願えますでしょうか。
参照で渡せば
87 :
nobodyさん :03/01/13 11:27 ID:eXLsypXq
>>85 my @a = ('A', 'B', 'C');
my @b = ('a', 'b', 'c');
my @c = ('11', '2', '3');
&abc(C => \@c, B => \@b);
sub abc
{
my %abc = (
A => undef,
B => undef,
C => undef,
@_
);
print "@{$abc{A}}\n"; # undef
print "@{$abc{B}}\n"; # a b c
print "${$abc{C}}[1]\n"; # 2
}
>>88 こっちの方が要望に近いのかな?
my @a = ('A', 'B', 'C');
my @b = ('a', 'b', 'c');
my @c = ('1', '2', '3');
&abc2('b', @b); # array=b a b c
&abc2('a', @a); # array=a A B C
&abc2('c', @c); # array=c 1 2 3
sub abc2
{
my $ary = shift;
my @abc = @_;
print "array=$ary @abc\n";
}
90 :
nobodyさん :03/01/13 12:53 ID:W4AV/IuU
>>89 それは違うじゃろ。
&hoge(@a, @b, @c);とかやって、混ざってしまうから、困ったんだと思う。
じゃあもう一つ提案。凝った事をしてあるのは、-wで怒られないようにするため
sub abc3 {
my ($a, $b, $c) = @_;
my @a = (ref $a ? @$a : undef);
my @b = (ref $b ? @$b : undef);
my @c = (ref $c ? @$c : undef);
}
&abc3(\@a, \@b, undef); #アドレスをそのまま渡す。参照渡し?
&abc3([ @a ], undef, [ @b ]); #コピーを作って渡す
>>90 ぉぉ、なるほど!
-wオプション考慮も良いですね〜
勉強になりますm(_ _)m
open で失敗した時に open(〜)||〜; で後者には $hogehoge = 1; とかは掛けないのでしょうか? 一応自分でやった限りは dieとexit と &hogehoge 等のサブルーチン しか使えませんでした。
>>92 ちなみに優先順位の違いです
open(〜) || $hogehoge = 1;
は
(open(〜) || $hogehoge) = 1;
となり
orは=より優先順位が低いので
open(〜) || ($hogehoge = 1);
と同じになります。。
95 :
nobodyさん :03/01/13 20:39 ID:vdJkNLtH
質問させて下さい。 CGI_Lite.pmを使ってファイルのアップロードをさせたいのですがわからないところがあります。 $upload = new CGI_Lite; 、、、略 $filename = $upload->filter_filename(\&conv); $upload->close_all_files; %dat = $upload->parse_form_data; でとりあえずファイルがアップロードされる事はわかりました。 <FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST"> <INPUT TYPE="text" NAME="Text"> <INPUT TYPE="file" NAME="File"> <INPUT TYPE="submit" VALUE="送信"> </FORM> フォームの部分をこのようにしてみたのですが、この場合textに入力した文字はどのような処理がされるのですか? 一応$dat{Text}で取り出せることは確認できたのですが、Fileの方とは別の処理になるのでしょうか? よろしくお願いします。
96 :
nobodyさん :03/01/13 21:48 ID:7xzy2NEr
97 :
nobody :03/01/13 23:16 ID:CGEjRZ/e
>>86 ,88,90
refを使えばいいのですね。
調べて使って行こうと思います。
質問の言葉が足りない中、正確に類推してくださった90さんには
格別の感謝を。
他の方々もありがとうございました。
下を解凍できますか? ----ここから _=_ _=_ Part 001 of 001 of file testdbi.zip _=_ begin 666 testdbi.zip M4$L#!!0````(`."Z+"YQ\[Y:G0```-,````*````=&5S=&1B:2YP;"V.L0K" M,!"&]T+?X2@=4C!@=2P)*H*X.KAHD9I>24#2D*94D;Z[B>EP</]]W\$_#@C' MP[E*D[Q]:I;O+Z?K;5W'+)E'E(M>:Q2.!&,5C;)>EDU=!'=PDH4'RHU%TU@D M$6__6'5`@D(YOE&,#@OXI@E,4KV0[&P_L4@[=$+Z^&BL;3Y1`C!6:0=9\.XZ MJ\)M3I,Y-J2\5<-2T*/2SP]02P$"%``4````"`#@NBPN<?.^6IT```#3```` M"@`````````!`"``MH$`````=&5S=&1B:2YP;%!+!08``````0`!`#@```#% %```````` ` end ----ここまで
99 :
yani ◆saNSktNEdQ :03/01/13 23:33 ID:ziR7v8Q2
自分でも考えてみたんだが、 $seed = unpack "%L*", md5(join '.', gettimeofday, $$, `ps axww |gzip`); というのはどうだろう。 実用的にはには $seed = unpack "%L*", md5(join '.', gettimeofday); で十分なようで、こちらのほうが相当速い。 # Time::HiRes, Digest::MD5とも perl5では標準モジュール 問題は$seedが16bit整数になることだが、、、なぜだ???
100 :
yani ◆saNSktNEdQ :03/01/13 23:34 ID:ziR7v8Q2
× # Time::HiRes, Digest::MD5とも perl5では標準モジュール ◯ # Time::HiRes, Digest::MD5とも perl5.8では標準モジュール
101 :
90 :03/01/13 23:35 ID:W4AV/IuU
あ。後で思いついたけど、間違えてハッシュのリファレンスとかを 渡しちゃうとコンパイルエラーになる・・。あと三項演算子の優先順位 をちゃんと理解していなかったから、無駄な括弧が・・ 修正版: sub abc3 { my ($a, $b, $c) = @_; my @a = ref $a eq 'ARRAY' ? @$a : undef; my @b = ref $b eq 'ARRAY' ? @$b : undef; my @c = ref $c eq 'ARRAY' ? @$c : undef; }
102 :
90 :03/01/13 23:42 ID:???
で、やってること自体は88と同じ。自分は拡張性が低い方法を書いてるだけ。・・
>>98 解凍でけたけど、できなくって困ってるのだったら
「できますか」なんてきくなよ。
104 :
nobodyさん :03/01/14 00:21 ID:uaEPu1zE
画像ファイルをアップロードしたり書き換えたりする プログラムを書いているのですが、 初めてアップロードする場合はよいのですが、 ファイルを書き換える(上書き)時、 どうも、ブラウザのキャッシュが悪さをしているようで ファイル上では書き変わっているのに、ブラウザ表示上では 以前の画像ファイルが表示されてしまう事があります。 (この場合何度かリロードしないと本来のファイルを表示してくれません) これを、書き換えた後はキャッシュを利用しないようには出来ないでしょうか?
105 :
nobodyさん :03/01/14 00:25 ID:yqTa2j5Q
106 :
yani ◆saNSktNEdQ :03/01/14 01:29 ID:HMXRNLis
>>98 .103
長いスクリプト貼り付ける時つかったらて思いますがいかがでしょう?
>>104 ファイル名にtimeのクエリを取り付けるとよかと。
(ただし、JavaScriptかSSIが必要)
読み込みたい画像が、
a20030114025535.jpg
だとするとき。
本来ならば、
<img src="a20030114025535.jpg" width="100" height="100" alt="img">
のところを、JavaScriptで排泄しる。
<script type="text/javascript"><!--
var T = new Date();
document.write('<img src="a20030114025535.jpg?' + T.getTime() + '" width="100" height="100" alt="img">')
// -->
</script>
など。
SSIならば、
表示させたいところに、
<img src="a20030114025535.jpg?time関数の値" width="100" height="100" alt="img">
を吐き出す .cgi を描く。
ブラウザの中には Pragma:no-cache 等を無視してくれよるのもおるから。
109 :
104 :03/01/14 03:54 ID:???
>>108 ほぉほぉなるほど!!
それならば、別ファイル(?)として扱われるわけですね。
HTMLのヘッダに
Pragma:no-cache
cache-control:no-cache
入れてまして、HTMLの方は非キャッシュOKだったんですけど
画像の方がどうもうまくいっておりませんでした。
今日は遅いので明日にでも試させて頂きますー。
蛇足。
>>85 関数を先に宣言するのであれば、
--
sub hoge(\@\@\@)
{
...
}
hoge(@a0, @a1, @a2);
--
と書いたとき、hoge(\@a0, \@a1, \@a2); と同じ効果を得られる。
たとえば、以下のように pop 関数を再実装することが可能。
(mypop(\@array) と書く必要はない。)
--
sub mypop(\@)
{
my $ar = shift;
my $last = $ar->[-1];
$#$ar--;
return $last;
}
$x = mypop(@array);
--
111 :
nobodyさん :03/01/14 04:58 ID:/jKmOe0i
他鯖のhtmlを読むにはどうすればいいですか?
socketとかconnectとかreadとか。
114 :
nobodyさん :03/01/14 05:45 ID:KVuhYobl
115 :
nobodyさん :03/01/14 06:42 ID:/jKmOe0i
>>113 ありがとうございます。
LWPを使って読めるようになりました。
作っているのは、よくある○○弁変換みたいな奴なんですが、
読み込むサイズによって過負荷になってしまいますよね。
サイズのチェック(一定量処理したらやめるような)は
どうすればいいのでしょうか。
Simpleのheadを使ってみたのですが
yahooさえcontent-lengthを返さないのでダメでした。
116 :
111 :03/01/14 06:53 ID:???
ん、UserAgentのmax_size([$bytes]) 、これでできそうですね。
117 :
nobodyさん :03/01/14 07:19 ID:ea2A6+p/
>>115 あまりに時間がかかりすぎるようなら、サーバーが500を返して勝手に止まるから、
それでいいじゃねえか
おいおい、過負荷で止まって「いいじゃねぇか」は ないだろ。そういうCGIが増殖するから、あんまり CGIがまともにつかえそうなところがなくなるんだよ。
>>107 とりあえず貧乏パーラは人にものを頼むときに「お願いします」って
言うってことを覚えとけ。
ほれ、
$ cat testdbi.pl
use DBI;
$dbn=$ARGV[0];
$dbh=DBI->connect($dbn,$ARGV[1],$ARGV[2]);
$sth=$dbh->prepare($ARGV[3]);
if ($sth->execute) {
while(@row=$sth->fetchrow_array) {
print "@row\n";
}
}
$dbh->disconnect;
1;
120 :
nobodyさん :03/01/14 13:10 ID:xMMJe1Uf
ハッシュのキーじゃなくて値でソートして、キーも値も出力したいんですけど うまくいきません。 ■スクリプトはこんな感じ ------------------------------------- %hoge = ('unko' => 5, 'chinko' => 3, 'manko' =>9); foreach my $k(sort{$hoge{$a} <=> $hoge{$b}}%hoge) { print("$hoge{$k}" . "\t" . $k . "\n"); } ------------------------------------- ■出力結果はこんな感じ ------------------------------------- 9 3 5 3 chinko 5 unko 9 manko ------------------------------------- いちおう値でソートしてくれてるんですが、目的の出力の前になぜか値の一覧が出てしまいます。 どうすればいいですか?( ´・∀・`)
121 :
◆PxAOHU.zVE :03/01/14 13:49 ID:pln/ogcF
>120 %hogeの前にkeysをいれる。
122 :
nobodyさん :03/01/15 00:32 ID:AlO2VnQa
Image::Magick を使って画像を作っています。 せっかく文字出力ができるので、webdingsなどのフォントにある外字を 使おうと思ったのですが、文字の指定方法がわかりません。 普通の文字なら $NEWIMG->Annotate( text=>'A', pointsize=>14, fill=>'#000000', x=>$posX, y=>$posY, font=>'img/ariblk.ttf' ); とやればいけるのですが、使いたい文字をアクセサリの「文字コード表」 から拾ってきても「?」になってしまいます。 文字コードはわかるからそこから指定できるのではないかと思いますが その指定方法がわかりません。 どのように指定したらいいでしょうか?
123 :
104 :03/01/15 01:59 ID:???
>>108 無事非キャッシュ成功いたしました。
ありがとうございました。
124 :
nobodyさん :03/01/15 02:08 ID:ybtk15GB
>>119 ありがとうサンキューです。
それってどうやってやりましたか?
DBD::PgPP使いました。 SELECTでフィールド8個以上をクエリするとエラーなります。 DBをMySQLにしてDBD::mysqlPPにしたらフィールド33個をクエリしてもOKでした クライアント、DB共にWinXPです。 DBD::PgPPはこういう制限があるという事でしょうか?宜しくお願いします。
$str = "1234";を最初の2文字"12"にしたいのですが、 どうすればよろしいでしょうか。 今は、chop $str;chop $str;でやっています。 VBAでいう、left(string,2)の様な関数?はありますか?
substr($target_str,0,2) VBAは良く知らんがN88BasicのMIDの感じだな。
129 :
127 :03/01/15 09:02 ID:???
130 :
nobodyさん :03/01/15 09:56 ID:2BGcsgzZ
131 :
nobodyさん :03/01/15 10:22 ID:wVEDeB5S
管理人(私)だけが項目を設定し、来訪者に投票してもらう
という投票・ランキングcgiを設置しようと出来合いの探したところ
項目が140あるので検索機能がついたvote.cgiを探したところ、
ttp://www.c-5.ne.jp/~hamachan/cgihtm/jiten.htm 上記↑で配布されている「簡易データーベース」というものにたどり着きました。
プログラムが古いので
require './jcode.pl';
#-----------------------------------------------------------------
↑これの次の行に↓この一行を追加しました。
open STDOUT, '>-';
jcode.plも新しいバージョンに変えて、説明書きにあったとおり
「ずっこけ物知り辞典」という表示がページに出るところまでは
うまくいったのですが、実際に登録・検索しようとすると、
「ページが見つかりません」、との表示が出ます。
ちなみに、Tripodを使っています。
FTPソフトで見ると、cgi-binフォルダの中に
jiten.cgi、jcode.pl、jiten.docが入っていますが
jiten.docのファイルサイズは0になっています。
count.docファイルは生成されていないようです。
どこをどう改善すればよいのか、ご指導よろしくお願いします。
>>131 データファイルを別ディレクトリにしてみたら?
TripodのCGI設置の説明をちょっと読んだけど、cgi-bin 直下に画像ファイルなどは
置けないとあるので、.cgi .pl 以外のファイルは全滅なのかもしれん。
あと、ここはPerlスレだからCGIに関する質問はできるだけ他のスレでやってな。
133 :
131 :03/01/15 11:00 ID:???
134 :
85 :03/01/15 12:12 ID:lPFUjXcR
>>110 ,101
ありがとうございます。
参照は初級者向けじゃないみたいで、例文に参照以外の
わからない箇所が多いので地道に勉強中。
ソース丸写し以外で使えるよう頑張ります。
135 :
山崎渉 :03/01/15 13:31 ID:???
(^^)
perlスクリプト中で 新たなPATHを追加したいと思ったんですけど $ENV{'PATH'} .= ';c:\hogehoge'; ではうまく行きませんでした どうやればいいのでしょうか?
137 :
nobodyさん :03/01/15 15:38 ID:5j+QQZeA
ご近所さんみたいなメール転送の仕組みを作りたいんですが... 色んなアカウントに送られてきたメールを片っ端からDBに登録したいのです。 なんかいい参考書やサイトを知りませんか? よろしくおながいしますm(_ _)m
138 :
vvv :03/01/15 15:42 ID:ZNHQB8hs
140 :
nobodyさん :03/01/15 19:13 ID:POOF/+eY
カテゴリで検索可能なサーチエンジンやリンク集などのデータファイルは、 下記の場合、どちらが効率的なのでしょう? 1.例えばデータファイルを一つにまとめ、 登録NO<>カテゴリ<>データ などと登録する方法 2.データファイルをカテゴリ毎に、 data1.log data2.log ・・・ 等と1カテゴリで1データファイルとする。 一つのデータファイルにまとめるとファイルが大きくなってしまい、 カテゴリ毎に分ける方が良い様な気もするのですが、 実際の所はどうなのでしょうか? サーバー付加の大小の観点からも御指導頂ければ幸いです。
141 :
nobodyさん :03/01/15 20:20 ID:mlzRLcDE
@tbl[100][100]; じゃ二次元テーブルってできないのですか? アルゴリズムを教えてください。
>>141 自己レス
すいません、二次元配列で検索した直ぐに分かりました・・・
はぁ・・・容易にはできないのですね。がんばって作ります。
143 :
58 :03/01/15 21:20 ID:???
$tbl[100][100] = 'Hello?'; print $tbl[100][100];
>>141 中身的にはリファレンスの配列になるけど、単にそれだけで使うなら
普通にそうやって書くだけで二次元配列になると思うが。
145 :
144 :03/01/15 23:45 ID:???
さすがに書けるよな…<連書規制に引っかかってた リストの二次元配列だから面倒だわ、忘れてくれぃ。
146 :
nobodyさん :03/01/16 07:53 ID:RDhobq0J
-$aaa=>[$bbb,$ccc] っていうのがあるのですがこの"[]"は何をやってるのですか?
148 :
nobody :03/01/16 19:36 ID:6WICp0JY
$bgcolor,$backgorundなどにはbodyタグで使用される文字が入っています(文字列が入っていることは確認済み)。 そこで、それらを結合するために $body = '<body bgcolor="'.$bgcolor.'" background="'.$background.'" text="'.$text.'" link="'.$link.' " vlink="'.$vlink.'" alink="'.$alink.'">'; と書いたのですが、なぜか$bodyが空文字になってしまいます。 超初歩だとは思いますがどなたか解決法を教えてくださらないでしょうか。
$body = qq(<body bgcolor="$bgcolor" background="$background" text="$text" link="$link" vlink="$vlink" alink="$alink">); $bodyが消える理由はわからんが。 スコープ外とかいうオチじゃないかな?
>>148 つうかなんのスクリプトよ。
話はそこからだろ?
阿呆?
>>148 つうかなんちゅうスクリプトの描き方だよ。
149氏のように書き換えてみてから実行して美奈代
153 :
143 :03/01/16 21:23 ID:???
>>147 ども、読破しました。
ところで@a->[1];の書き方ってありでしょうか。
素直に$a[1];と書けばいいんでしょうけど…。
154 :
nobodyさん :03/01/16 21:31 ID:rmmrK9en
\{@a}->[1]
155 :
◆ZnBI2EKkq. :03/01/16 21:59 ID:4OjEZO2W
あるプログラムのHTTPヘッダ出力の部分で my $expires = shift; ・・・ if($expires > 0) { グリニッジ標準時の文字列を作って } print "Set-Cookie: ・・・ とやっているのですが $expiresには何が入って どういう意味で使ってるかわかりません。 教えて下さい。よろしくお願いします。
156 :
nobodyさん :03/01/16 22:27 ID:t/gkHHSA
>>155 expireの意味知ってますか?
クッキーの有効期限設定してるんだろ
expireなしなら、セッション間のみ有効なクッキー
CGIの話ね
157 :
nobody :03/01/16 22:30 ID:6WICp0JY
>>149 ありがとうございました。
それをコピペしたら普通にできました。
原因はじっくり解明したいと思います…。
158 :
nobodyさん :03/01/16 22:45 ID:Tl7JXy0h
mod_perl 用にソースを改造してんだけど、 ほとんどのサイトでは use strict 使う -w スイッチ使う グローバル変数をなるべく使わないようにする /o スイッチ使わない くらいしか書いてない。 なのに、この通りやってもなんか銚子が悪い。 mod_perl で動かすときって何か他にやらなきゃいけないことってあるん? 例えば eval 使ってはだめとか、 オブジェクトはちゃんとDESTORYしないとだめとか。
159 :
nobodyさん :03/01/16 22:49 ID:rmmrK9en
exitを使わない。require ... で読み込んだ物に注意する。
ファイルをOpenして その中にある hoge 言う文字がいくつあるかカウントしたいんですが どうすればいいんでしょう? open (HOGE,"hoge.txt"); ????? close(HOGE);
>>160 hogeがどんな風に入っているかで変わってくる。
一つの行にhogeが0か1個しか入っていないことが保証されているならば、
open(HOGE, 'hoge.txt');
@hoge = grep { /hoge/ } <IN>;
close(HOGE);
$count_hoge = scalar @hoge;
全く保証されていないならば、
open(HOGE, 'hoge.txt');
$hoge = join('', <IN>);
close(HOGE);
$count_hoge = $hoge =~ s/hoge//g;
これでいいような気がする。
$count += map {1} /(hoge)/g while <HOGE>;
>>160 Cだとものすごく簡単だけど、Perlだとそんなに難しいのか?
164 :
nobodyさん :03/01/17 15:03 ID:l3uVFji3
オブジェクト指向Perlを始めたのですが、 メソッド(サブルーチン)の引数が正しくない (引数の数が正しくないとか、数字であるべきところが文字列だったとか) の場合、どうすればいいのでしょうか? エラーを表示? エラーを返して終了? 単にreturn?
>>164 他人の書いたコードも見てみるといいよ。
あと、標準の Carp モジュールも調べてみたら。
167 :
nobodyさん :03/01/17 18:46 ID:95w9V4FK
煮詰まっています。画像アップ掲示板を
設置しようとしています。
とりあえず入り口は出来たのですが、肝心の出口がどうやら設定がおかしい
ようで"画像をアップできません"とエラーが出ます。
恐らく下記の設定方法を間違えているのでエラーが出るのだと思います。
# アップロードディレクトリ
# → パスの最後は / で終わること
# → フルパスだと / から記述する
$ImgDir = "?????.hp.infoseek.co.jp/clip/img/";
# アップロードディレクトリのURLパス
# → パスの最後は / で終わること
$ImgUrl = "
http://?????.hp.infoseek.co.jp/clip/img/ ";
色々調べたのですが、ここの部分だけハッキリ答えが出せません。
どうか出口の設定方法を教えてください。
168 :
nobodyさん :03/01/17 19:00 ID:zt5lo6Y5
# に書いてあるとおりにやればいいんじゃ? 今どう設定してあってエラーでてるの? てか何を悩んでるの?
1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 て書いてくれ。 下げてみるテスト(鬱
170 :
nobodyさん :03/01/17 19:10 ID:mT3lwUSe
MAC OS10.2.3でFTPにアップロードするとファイルが 壊れて0バイトになってしまいます。 使用ソフトはTransmitとNetFinderです。 アップするファイルはCGIのためアスキーモードで転送しています。 でもファイルが壊れてしまいます。 9だとうまくアップできるんですが・・・ どなたか詳しい人教えて下さい
>>160 my $str;
my $file = 'hoge.txt';
my $hoge_count = 0;
open TXT, $file or die $!;
read TXT, $str, -s $file;
close TXT;
while($str =~ m/hoge/g){
$hoge_count++
}
print $hoge_count, "\n";
ログを追記式にしていたのですが ファイルがかなり大きくなってきて ファイルを全て読み込まず ファイルの末尾から一行ずつ読み込みたいのですが、 どうしたらいいのでしょうか?
>>172 無理です。日毎、週毎などでログファイルを切っていきましょう。
でもtailみたいなプログラムもあるのですから可能なのではないですか?
>>174 んぢゃ tail を使う。
print `tail -n $num logfilename`;
177 :
173 :03/01/17 20:31 ID:???
>>174 tailを知っていたのなら、ソース読んじゃえばいいのに。
全部読み込んでいるよ。まあ、細かく言えばPerlのようには
読んではいないけど、全てを読み込まないのに最後を知る
方法はないです。
178 :
nobodyさん :03/01/17 20:44 ID:GSBryIjf
>>177 おまえはあほか。seekすれば、読まなくても飛べる。あと、便利なモジュールがある。File::ReadBackwards
179 :
173 :03/01/17 20:47 ID:???
seekは読み込んでいないとでも?
180 :
nobodyさん :03/01/17 20:56 ID:GSBryIjf
場所を指定しただけ。読むっていうのはもちろん中身を読み込むって意味でしょ?
181 :
175 :03/01/17 21:02 ID:???
訂正: # アップロードディレクトリのURLパス # → パスの最後は / で終わること $ImgUrl = "$ENV{'HTTP_HOST'}/clip/img/"; スマソ ってこれでいいのか?(スクリプトが別鯖にある場合は不可)
182 :
143 :03/01/17 21:12 ID:???
>>154 その文だと{}で無名のハッシュをつくり、
\でリファレンスしませんか?
(\@a)->[1];がまっとう(?)ですので、@a->[1];は使うべきでは無いようですね。
ありがとうございました。
>>165-166 レスありがとうございます。
にしてもOOP Perlはサパーリ和歌欄買った。
184 :
173 :03/01/17 23:14 ID:???
>>180 指定して飛ぶときに、全然読んでないわけ?OSも
185 :
nobodyさん :03/01/17 23:14 ID:xM0Mt5EA
PerlでもRubyでもそうだけど、 class Person { int age; String name, tel; URL homepage; } みたいなメンバ変数の型みたいな考え方無しのオブジェクト指向って のが理解できなくて立ち往生してるのですが、どうやればすんなり 受け入れられますか?
173ってちょと臭わない? 全角英字DQN?
187 :
超初心者 :03/01/17 23:28 ID:sm0odS2/
>187 そのCGIスクリプトの説明を読むか。 配布されているサイトで聞いてください。 ここはPerlのコーディングの話をするスレッドです。
>>188 説明書にも何も書いていなくサイトの管理人にメールを出したけど
返事がずっとないんで…
Perlは分かるの? 親切な人が説明してくれても分からなかったらしょうがないでしょ。
192 :
185 :03/01/18 00:07 ID:???
>>189 例えば
$self->{'age'}
って変数があっても、
$self->{'age'}='nobodyさん' とか $self->{'age'}='
http://www.2ch.net '
ってすることができるわけで、
いくつかモジュールを読んでみたけど
たんにメソッドの詰め合わせ的な意味しかないようが気がするんです。
193 :
nobodyさん :03/01/18 00:20 ID:O9FxKTGG
来客者は書き込めるが、他の来客者が書いたものは見られないようなcgiってありますか?
>193 探すだけならスレ違い。 ここはコーディングの相談所。 >1読め。
195 :
◆PxAOHU.zVE :03/01/18 01:56 ID:55Z6A3Vx
196 :
nobodyさん :03/01/18 08:30 ID:eKp44Q6B
>>185 Perl6 で型が出来るだろ。
それでいいじゃないか。
197 :
びびった :03/01/18 09:14 ID:x+/Sd8AA
perlプレビュー機能のあるエディタってありますか? perl Builderぐらいしかないのでしょうか?
199 :
HOGE :03/01/18 15:51 ID:5ALQn0gp
以下のようなことをやりたいのですが、うまくいきません。 とても困っています。どうすれば良いか教えてください。 #!usr/local/perl #in hoge.cgi my $hoge = 'hoge'; require './hoge.tmpl'; #in hoge.tmpl print <<HOEG Content-type: text/html <h1>$hoge</h1>; HOGE 1;
1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
201 :
HOGE :03/01/18 16:05 ID:5ALQn0gp
1:冗長なフォーマット部分を別のファイルにしようと思いマスタ。 2:Webで調べていると、require文を使えば、 「その場所にかかれているかのように スクリプトを取り込むことができる」と知りました。 3:でも、$hogeの部分は空のままです。 require文の解釈が間違っていることは自覚しています。 名前空間のせいで、変数が受け渡されていないのかもしれません。 しかし、今の私には具体的にどうすればいいかがわかりません。 質問に2レスもつかってすみません。どうか教えてください。
202 :
vvv :03/01/18 16:09 ID:+GEyyv8c
>>201 our $hoge = 'hoge';
print <<HOGE;
204 :
nobodyさん :03/01/18 17:08 ID:lJXENDzT
質問です。 和鳥の無料WebスペースにCGIのカウンタを置こうと思い、探して来ました。 見つけてきたそのCGIは、説明書きによるとcgi-bin以下に画像ファイルを置いて、 それを引っ張り出してくるものらしい。 けど、和鳥には、「セキュリティ上の都合から、cgi-bin以下に画像ファイルを置いても 表示されないので、別の場所に置いてくれ。」との旨が書いてあり、そのままではうまくいかなかった。 そこで、画像ディレクトリを別の場所へ移したわけなのですが、、、えーと、そしたら 「$imgdir = './Gif/';」の部分は、このままではダメなのでしょうか? 試しにそのままやってみたらエラーになったので、省略せずにURLそのまま入れてみたりしたのですが、 やはりだめでした。 画像自体はちゃんとうpされていたので、私的にはその部分になにか間違いがあるのかなと 思ったのですが。。 どしたら良いでしょうか。すいません、どなたか教えて下さいです。
>204 1:パスが間違っている(HTMLの勉強しろ) 2:パーミッションが間違っている(パーミッションの勉強しろ) 3:そもそもperlの話じゃないからココではスレ違い(常識を勉強しろ) 4:配布元か、和鳥スレで聞け
>>199 #!usr/local/perl も不安といえば不安だな
>>204 URLで入れたら動きそうな気がするが、大文字小文字は間違ってない?
ここで言ってるURLは
http:// から始まるやつね
207 :
204 :03/01/18 17:25 ID:lJXENDzT
>>205 スイマセン スイマセン スイマセン
>>206 ありがとです。
んー、でも大文字小文字はあってるような。。
208 :
204 :03/01/18 17:26 ID:???
下げ忘れてしもた。。ごめんサイ。。
>>164 エラーフラグ立てた上で、オブジェクトを返しておいて
is_error,error_message等のメソッドを用意するってのは?
>>206-207 CGIが画像ファイルを直接読むんだろ。URLじゃ駄目に決まってるじゃねーか。
213 :
nobodyさん :03/01/19 06:35 ID:5v4SEFP4
配列についてなのですが、配列名に変数って使えないのでしょうか? @hoge$iっていう配列を使いたいのですがうまくいきません。
>213 @{$i}
>213 @{"hoge$i"}
シンボリックリファレンスだから、use strict;してたら、動かない。 その場合、これを書くとエラーが出なくなる no strict 'refs';
>格闘してやっとけりついたよ。どんな事したか以下の通りです。 >----------------------------------------------- >・読み出しも外部からのインクルード式で可能とした >・処理速度向上策バイトコード化した一連の定義を繰り返しで処理から > do{}でそれぞれくくって一つのブロックとして一気にバイトコードに展開版に変更。 >・出力スキップSWにて定義中の式の組み方でコンバートバージョンにも出来るcnv.txt > ○のオーダはXXXX.txtで処理する。 > 前回俺が出した集計項目も網羅して7日間のデータを/m指定で >各人分散し集計を起動する事にする. >その間に出力CSVを合成するツール作成の事。(Excelでやれってかぁ?) >----------------------------------------------- >て訳で連日プログラムして疲れたよ。今晩ラーメンでも食べに行こうか? 何をやったのかさっぱりだけど、、、 なんか私には解らない凄いプログラム作ったのかな? でも歳も歳なんだから無理しないようにね! ラーメンか〜良いね。でも肉が食べたいな〜 わがままです。。。
if ($ENV{QUERY_STRING} !~ /=/) { ... }
221 :
219 :03/01/19 16:23 ID:???
>>220 さん回答ありがとうございます。できました。うれしいです。
いや、適当に考えただけだけど、これくらいしか手段が無いような気がするから・・
223 :
nobodyさん :03/01/19 17:26 ID:YTKbQL3j
すいません質問させてください。
サイトA(私が作成するサイト)にあるCGIページにアクセスすると
別のサーバのサイトBにあるファイルをそのまま読み込んで表示するCGIを作ろうと
しています。
(もちろん、サイトBの管理者の許可はあります。)
その準備として次のものをつくったのですが、
ローカルで実行するとうまくいくのですが、サーバーにアップすると動きません。
ローカルホストのところを
自分のPCのものにしても、サイトAのホスト名をいれてもうまく動きません。
原因がわかるでしょうか?
お願いいたします。
#!/usr/local/bin/perl
use Net::hostent;
use Socket;
$lodalhost='hogehoge.ne.jp';#ローカルホスト名
$remotehost='www.xxxx.com';#リモートホスト
$page = '
http://www.xxxx.com/index.html ';#得たいページのURL
224 :
続き :03/01/19 17:26 ID:YTKbQL3j
#接続を確立し、ファイルハンドルSHに繋ぐ。 $lh = gethost($localhost); $rh = gethost($remotehost); $proto = getprotobyname('tcp'); socket(SH,AF_INET,SOCK_STREAM,$proto) or print "error\n"; $port = getservbyname('http','tcp'); $socket_template = 'S n a4 x8'; $localhost_port = pack($socket_template,AF_INET,0,$lh->addr); $remotehost_port = pack($socket_template,AF_INET,$port,$rh->addr); bind(SH,$localhost_port) or print "error\n"; connect(SH,$remotehost_port) or print "error\n"; select SH; $|=1; print SH "GET $page\n";#GETをつかってリクエストを送信する。 #得られたページの内容を@HTMLに代入する while(<SH>){ push @HTML,$_; } close SH; select STDOUT; foreach(@HTML){ print $_; } exit;
>>224 >print SH "GET $page\n";#GETをつかってリクエストを送信する。
少なくともリクエストヘッダの終了は\n\nで終わらなきゃならいないと思うが
ちなみに他のヘッダ情報は要らないのかな?
例
GET /test/read.cgi/company/1034689226/l50 HTTP/1.0
If-Modified-Since: Mon, 13 Jan 2003 17:35:10 GMT
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.m
s-powerpoint, application/vnd.ms-excel, application/msword, */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: tmp.2ch.net
>>225 補足
例えば2chのちくり板のサーバはGETリクエストヘッダのHost:や
POSTのRefere:中のホスト名をチェックしているからね。
227 :
nobodyさん :03/01/19 18:20 ID:xgcJy6Dh
聞くべきか悩みましたがすみませんが質問させていただきます。 cgiの画像アップ形式掲示板ってありますよね? サーバーの容量もあるとは思いますが、大体みなさん設置 するに当たって"最大投稿データ量"ってどれくらいに設定されてますか? 後"最大投稿数"はどれくらいで適切なんですか? 変な質問ですみません。
228 :
bbb :03/01/19 18:44 ID:TK7ESc1C
230 :
nobodyさん :03/01/19 22:37 ID:hs+tYJ37
データベース系のCGIをwakwakサーバに設置したいのですが、 cgi-binの中にhtmlファイルを入れると呼び出すことができません。 また、public.htmlの下にhtmlファイルを置き、cgiからのパスを修正しても"ファイルがオープンできません"とでます。 こういうサーバではhtmlを使うcgiは置けないのでしょうか?
>>230 スレ違い
ここはCGIの質問スレではありません。
あくまでwebProg板の中のPerlスレだろ。 PerlをつかったCGIならCGIの質問だってOKだろ。 PerlからMySQL呼び出してどーこーするのっていいんじゃないの。 まぁ230の質問はPerlともCGIとも直接関係なさそうだが。
233 :
おながいします。 :03/01/19 23:56 ID:tLwHArOB
初心者の私めに諸先輩方の御教授願います。
localhostではちゃんと起動するのですが、niftyのサーバに上げると
自分がスクリプト内で指定したメッセージ、
「現在投稿ができない状態になっております。」
が出ます。絶対パス($targetfile=以下) の書き方が悪いのでしょうか?
この箇所は考えられ得る色々な書き方(URLにするとか)で書き替えて
試しましたがダメでした。
問題点を教えて頂ければ幸いです。
ちなみにhomepageというのはniftyのホームページ設置ディレクトリ名です。
下のスクリプトはもちろん関係箇所だけですがその途中も省略しています。
#!/usr/local/bin/perl
$|=1;
require "cgi-lib.pl";
$date = localtime;
$workdir = "/temp/";
$targetfile = "/homepage/messageboard/1.html"; #絶対パス
$guestbookurl ="
http://homepage2.nifty.com/aaabbbccc/messageboard/1.html ";
$body = $in{'body'};
$name = $in{'name'};
$mail = $in{'mail'};
(略)
open WORKF, ">$tempfile"
or &CgiDie("現在投稿ができない状態になっております。");
open GUESTBOOK, "<$targetfile"
or &CgiDie("現在サーバが投稿を受け付けません。");
>>230 wakwakのページをみると、imageファイルはpublic_htmlの下に置くようにって書いてあるね。
htmlでもいけそうな気がするけど、もし画像ファイルしかCGIから読み出せないってことなら
そのhtmlを画像ファイルの拡張子に変えてみたら?
それでダメだったら問題は他にあるってこと。
>>233 ちゃんとソースみてないけど、ディレクトリのパーミッションの問題じゃない?
234さん、お返事ありがとうございます。 ディレクトリのパーミッションも変更してみましたが、以前同じ エラーメッセージが出てしまいます。 あ、ちなみにさっき書いたスクリプトで省略してしまった所があるの ですが、それは $tempfile = $targetfile; $tempfile =~ s/[:\/\\]/_/g; $tempfile = $workdir .$tempfile . $$ . ".tmp"; です。宜しくお願い致します。<(_ _)>
ファイル名が14バイト制限を受けているとか。 それはないか…。
niftyってルートに独自ディレクトリ作って OKでしたっけ? $workdir = "./"; にしてみるとか。
>>233 $tempfile の最終形をみてみる。
すたぁと。
$targetfile = "/homepage/messageboard/1.html"; #絶対パス
$workdir = "/temp/";
$tempfile = $targetfile;
#$tempfile = "/homepage/messageboard/1.html";
$tempfile =~ s/[:\/\\]/_/g;
#$tempfile = "_homepage_messageboard_1.html";
$tempfile = $workdir .$tempfile . $$ . ".tmp";
#$tempfile = "/temp/_homepage_messageboard_1.htmlPID.tmp";
#PIDはプロセス番号
>>237 氏の仰有るとおりにしると、
#$tempfile = "./_homepage_messageboard_1.htmlPID.tmp";
♥
とりあえず。
239 :
nobodyさん :03/01/20 15:53 ID:emhs1xha
初歩的な質問かもしれませんが、よろしくお願いします。 あるファイルoutput.txtの内容が次のようだったとします。 02あいうえお 01あかさたな 00かきくけこ このファイルの先頭に1行つけたして、 03たちつてと 02あいうえお 01あかさたな 00かきくけこ としたいのですが、どうすればいいでしょうか? ファイルの末尾に付け足すのはかんたんなのですが・・ seek(OUT,0,0);をやて書き込んでも、一部、上書きになって 消える部分があるし 困っています。
241 :
239 :03/01/20 16:05 ID:emhs1xha
>>240 ありがとうございます unshiftを調べたところ
配列を扱うもののようです。いったん配列に取り込まないと
いけないということでしょうか?そうだとすれば
while(<IN>) {
$mes .= $_;
}
print OUT $newmes . $mes;
とするのと同じで、メモリをくってしまいますので、
だめっぽいです。
>>241 $txt = 'output.txt';
$tmp = 'output.tmp';
open TXT, '<' . $txt or die $!;
open TMP, '>' . $tmp or die $!;
print TMP $new_line;
print TMP $_ while <TXT>;
close TMP;
close TXT;
rename $tmp => $txt or die $!;
>>239 この質問は過去に何度か出ていた気がする。
その時の回答は確か
*書きこむ時は普通に追記して、読み出すときにreverseかける
*テンポラリファイルを作ってリネームする
の二つ。
前者は読み出す時に配列に入れなきゃならないし、
後者は排他制御が面倒な予感。
もっと良い方法があるなら俺も知りたい。
>>239 output.txt.tmp を新規作成する。
output.txt.tmp に新たな1行のみ書きこむ。
output.txt を読み込む。
output.txt.tmp に追加書き込みする。
output.txt を削除する。
output.txt.tmp を output.txt に名前変更する。
ただし、output.txt.tmp がすでに存在するときは上記の操作を行わない。
で、どうだ!?
245 :
nobodyさん :03/01/20 19:16 ID:gSzazTge
>>244 少し間違ってるなぁ。
削除する必要はない。削除するとファイルが存在しない時間が少し発生するから良くない。
それから、存在チェックと書き込みは同時には行われないから、
O_EXCLを書いてopenするといいかもしれない。ファイルが存在したら失敗とする。
この方法の問題点は、中途半端な状態で残ったoutput.txt.tmpをどう扱うか、にある。
246 :
nobodyさん :03/01/20 19:43 ID:8rfuT7oA
ファイル中の文字数を数えようと思い、次のように書きましたが、全角が2文字部としてカウントしてしまいます 半角全角問わずに一文字ずつ数えたいのですがどうしたらいいでしょうか foreach(<LOG>){ @str1 = split //,; $total += @str1; }
247 :
劉邦 :03/01/20 20:09 ID:QoYi51kG
良いperlの入門サイト教えてください。
>247 検索して探せ。 いいか悪いかは自分で見て判断するしかない。 他人にいいサイトが自分にいいとは限らない。 >248 入門は別のところでしてほしいぞ。 HellowWorld!から教える気か?
250 :
劉邦 :03/01/20 20:54 ID:QoYi51kG
>>250 とりあえず藻前の書いたスクリプト書いてみ。
ちなみに解答そのままだと、address.txtからは読めないぞ。
>>250 解答が1つしかないのが気にいらないなぁ・・・
無駄でももっといろんな解法があると思うのに。
>>250 解答ではaddress.txtを標準入力から読み込むようになってるから、
単体で動作させたいときはファイルから入力するように修正しないといけないよ。
254 :
劉邦 :03/01/20 22:12 ID:QoYi51kG
入力といったら<STDIN>しか、知らないのですが・・・ 例えばどんなものがあるのですか?
255 :
劉邦 :03/01/20 22:20 ID:QoYi51kG
標準入力から直接入力した場合はちゃんと機能するようですが・・・
256 :
251 :03/01/20 22:27 ID:???
>>255 ファイルオープンしてごにょごにょ。そのページだと9かね。
ま、一通り読んでみ。
257 :
劉邦 :03/01/20 22:30 ID:QoYi51kG
9すか・・?! 入門者に対するイジメじゃないですかね・・・(^-^;A
258 :
nobodyさん :03/01/20 22:31 ID:qfdWUXSE
259 :
劉邦 :03/01/20 22:39 ID:QoYi51kG
入門サイトかえることにしますた。
しかし、このページって著作権とか大丈夫なんかねぇ? 初めてのperl第一版そのままっぽいんだけど翻訳元とか全く書いてないし 訳されたと言う日付の時点で既に第二版すら出版されてるわけだが。 というわけで、サイトの中身そのものはそう悪くないぞ。 れっきとした書籍のほとんどそのままだからな(笑) ま、当然本屋で本物を買ってきた方が良いけど。三千円ね。
>>260 てか、今更Perl4もねえだろ。使ってる鯖が古いならともかくさ。
本気でやろうと思ったら、最新の駱駝を買うのが一番だろ。
262 :
nobodyさん :03/01/21 01:23 ID:S5Xqr2nK
質問があります。 お答えしてくれるとうれしいです。 開催日に合わせて発売するというものを作ってまして 時間チェックでわからなくなってしまいました。 発売前・中・締切と時間でフラグを立てて制限したいのですが 頭がこんがらがってなかなかできません。 $buyflag [0:発売前] [1:発売中] [2:締切] 現在の時刻をそれぞれ [分:$min] [時:$hour] [日:$mday] [月:$mon] [年:$year] とし、開催日時のデータを@daydataという配列に それぞれ年[0]、月[1]、日[2]、時[3]、分[4]として入れています。 開催日時のちょうど3日前に発売開始[1:発売中]でそれより前は [0:発売前]、開催日時の1時間前に[2:締切]としたいのです。 どなたか教えてくださいませんか?
>262 わからなくなったら、紙に書いて整理しな。 頭の中だけでやろうとするからわからなくなる。 ここで質問したいなら、ソースくらい出しなさい。
>>262 日時は2桁で揃えられていると仮定して、
$opoentime = join("", @daydata);
$nowtime = "$year$mon$mday$hour$min";
if($opentime - $nowtime < 100){ $buyflag = 2;}
elsif($opentime - $nowtime < 30000){ $buyflag = 1;}
else{ $buyflag = 2;}
んーむ、感覚的に殴り書きヽ( ´ー`)ノ
あ、変数名一部間違えてますな 失礼しました。 $opoentime = join("", @daydata); → $opentime = join("", @daydata);
,一-、
/ ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■■-っ <
>>267 んな こたァない
´∀`/ \__________
__/|Y/\.
Ё|__ | / |
| У.. |
>>246 Perl ver5.8をインストールする。ActivePerlならbuild804.
以下は漢字コードをShift_JISとした例。
---^ t.txt
123456
---$
my $count;
open my $file, "<:encoding(Shift_JIS)", "t.txt";
while (<$file>) {
chomp;
my @char = split//;
$count += scalar(@char);
}
print $count,"\n";
質問です if($a =~ /(aaa|bbb)/){⊂} と同じように if($a eq /(aaa|bbb)/){⊂} という書き方はOKでしょうか?
>>270 NG。
正規表現の部分が、上は $a を評価するのに対して、下は $_ に対して評価した値と
$a を文字列として比較するので、わけわからん結果になる。
272 :
za :03/01/21 10:02 ID:???
EUCの日本語を、Unicodeの数値参照コード(???????;)に変換する モジュールは無いでしょうか? それともUnicode-Japaneseで可能でしょうか?
273 :
za :03/01/21 10:05 ID:???
>数値参照コード(???????;) 失礼。「&#??????;」です。(^^;
274 :
nobodyさん :03/01/21 12:45 ID:f7zzet+E
>>274 そのスクリプトが入ってるdirectoryに
「AddDefaultCharset EUC-JP」と書いた「.htaccess」を入れるとか。
276 :
274 :03/01/21 13:13 ID:f7zzet+E
>275 いれてみたら出来ました!本当にありがとうございました!
277 :
246 :03/01/21 14:09 ID:NhrI/baV
>>269 できました!!
jcode使ったりいろいろ悩んだのですがこれで解決しました。ありがとうございました。
>>274 ファイルを保存するときに文字コードを間違っているだけだろ。
279 :
262 :03/01/21 15:03 ID:???
こんな感じでできるようになりました ありがとうです。 $nowtime = sprintf("%d%02d%02d%02d%02d",$year,$mon+1,$mday,$hour,$min); $opentime = join("", @daydata); if($opentime - $nowtime < 100){ $buyflag = 2; } elsif($opentime - $nowtime <= 30000){ $buyflag = 1; } elsif($opentime - $nowtime > 30000){ $buyflag = 0; } else{ $buyflag = 2; }
でも多分当分戻ってこないよ。
264ともどもにずっともどってくんな!
質問です。 自分も初心者ですが>274のスクリプトが気になったんで 設置してみたんですが、記事を投稿はできても記事の削除をすると 500 Internal Server Errorが出てしまいます。 どうすれば削除することができますか?
>>284 暇なんで試してみたが・・・おいおい、そのスクリプト作りかけ何じゃねーのかYO!
お○○チンが・・・ねえ!!
sub read_data
{
open(READ,"$datafile") || &error ('ファイルオープンエラー');
@data = <READ>;
close(READ);
}
sub write_data
{
open(WRITE,">$datafile") || &error('ファイルオープンエラー');
print WRITE @data;
close(WRITE);
}
でも追加しとけ!
後はしらねーーー
286 :
nobodyさん :03/01/21 19:57 ID:owIuUjTB
Perlを作るテキストソフトは秀丸で十分でしょうか?
287 :
286 :03/01/21 19:59 ID:owIuUjTB
それともう一つ質問なのですが、 ネット上にある講座などの知識だけで上達できますか? 参考書がないと歯が立たないものなんですか?
>>286 あやしい言葉づかいだねぇ。
秀丸を使いこなしているのなら、もちろん十分でしょう。。
>>287 もちろんネット上のテキストだけで上達できる!
色々プログラミングしまくってくれ!!
>>287 でも、一冊辞書みたいな本があると能率が上がるのも確か。
紙って発明品は偉大だよ。
>290 参考書籍スレに逝ってください。
紙降臨
寒いスレだな・・・
そういえばPerlの本って一度も読んだこと無いな。漏れ。。
295 :
239 :03/01/21 22:02 ID:???
ファイルの先頭に追加の件ですが、ありがとうございました。 根本的な解決法はなかったのですね・・・ 現状ではtmpファイルをつかって行おうと思います。 作成しているものが携帯電話対応のルーム数不定の チャットなので、高負荷なことは避けたかったのですが どうせあんまり使う人はいないだろうからいいか っとおもいました
>>295 >作成しているものが携帯電話対応のルーム数不定の
>チャットなので、高負荷なことは避けたかったのですが
なんかサーバサイドとクライアントサイドの区別が未だに付いてない予感。
>>296 アフォキタ━━━━(゚∀゚)━━━━!!!!!!
歴代のこのスレで「ファイルの先頭に追記したい」という質問はよく出てきた。 そういった時の返答は大体決まってる。 ファイルの先頭に追記するのではなく、ファイルの末尾に追記して、読み込みの時にreverseしろ。
>>297 アフォキタ━━━━(゚∀゚)━━━━!!!!!!
なんだ? ホンとに阿呆がいるYO
みんなで阿呆ゥ!
302 :
239 :03/01/21 22:49 ID:???
>>296 携帯電話側はdocomoのやつなのでjavaでiアプリを作ってます。
ある程度そっちができたので、次はサーバーサイドを作っています。
本当はサーバーサイドもjavaでいこうとしていたのですが、
今までperlを使ったことがあったのと、実装の簡単さでperlのcgiに
しました。
ファイルの末尾に追記してリバースする方法と
tmpファイルを作成する方法はどちらが効率がよいでしょうか?
チャットにおいて、
サーバー側に持っておくログを50行までと決めておけば、
リバースでよいかな
>>302 全部配列に読み込んでunshiftと言うのは?
304 :
239 :03/01/21 23:16 ID:???
>>303 はい。結局reverseもunshiftもリストに読み込む
tmpはリストは使わないがファイルアクセス
なんですよね。まずはファイルアクセスのほうを試してみます。
>>272 use Encode;
my $str = 'あいうえお';
my $utf_str = decode('EUC-JP', $str);
$utf_str =~ s/(.)/sprintf("?%d;",unpack("U",$1))/ge;
print $utf_str ,"\n";
>>305 sprintfの?の部分は&#。ampersandとsharpが表示されていない。
307 :
nobodyさん :03/01/22 00:07 ID:NkPjRdCp
>>262 他に必要な人がいるかもしれないから、もっと簡単な方法。もう出てるけど。
>>264 の方法でも、時刻は増加するから一見問題が無いように見えるけど、
日をまたいだ場合とか、桁が変わる場合を考えると、簡単には出来ない。
はっきりいって、そんなことを気づかない人間が、質問に答えるな、と。。
time()の戻り値、UNIX時間(でいいかな?時刻なんだけど)
$start = どっかから持ってくる;
$left = $start - time;
if ($left >= 60*60*24*3) {
$buyflag = 0;
} elsif ($left >= 60*60*1) {
$buyflag = 1;
} else {
$buyflag = 2;
}
>>304 追記してリバースは、
>>178 に書いた方法を使えば簡単。
reverseって、配列に読み込むっていう意味じゃなくて、ひっくり返して読む
っていうだけだと思う。が。(そうじゃないと異常にもったいない)
頻繁に先頭に追加が発生するなら、データ構造の設計がおかしい。
308 :
nobodyさん :03/01/22 00:09 ID:NkPjRdCp
げ、途中だった。 開始時刻も、time()の戻り値の形式でいれておくこと。 適当なモジュールを使えば作れる、と思う。
309 :
239 :03/01/22 00:16 ID:???
>>307 ありがとうございます。
モジュールがあるのですね。今度調べてみようとおもいます。
普通にseekすると上書きになちゃうので・・
下から読むのも行ごとによめればいいけどそうでもなかったので
チャットなので発言ごとに毎回ファイルの先頭に追加したいので、
データ構造の設計がおかしいのですね・・
310 :
nobodyさん :03/01/22 00:36 ID:NkPjRdCp
>>309 チャットなら、保存する量を制限する、だろうから、単純な追記では良くないね。
おそらく、50行くらいなら、メモリーに入れて処理したほうが速いと思う。(ベンチマークしてみよう!)
具体的には、@lines = <IN>; unshift(@line, 新しい行); pop(@line);
311 :
nobodyさん :03/01/22 00:38 ID:NkPjRdCp
少し間違ってるけどわかる。だろう。・・ ベンチマークは、Benchmarkっていうモジュールが標準で付いてるから、 それをつかってやればいい
>>262 sub get_time {
my ($sec, $min, $hours, $mday, $mon, $year) = @_;
my @monthly_days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
my $days, $i, $time;
$days = 0;
$days = ($year - 1) * 365 + int (($year - 1) / 4) - int (($year - 1) / 100) + int (($year - 1) / 400);
for ($i = 1; $i < $mon; ++$i) {
$days = $days + $monthly_days[$i - 1] + ($i == 2 and $year % 4 == 0 and ($year % 400 == 0 or $year % 100 != 0));}
$days = $days + $mday;
$time = ($days - 719163) * 86400 + ($hours - 9) * 3600 + $min * 60 + $sec;
$time;}
313 :
za :03/01/22 03:21 ID:???
>>305 をを、うまく行きました!
本当にありがとうございます。(_ _ )
314 :
nobodyさん :03/01/22 04:14 ID:spwoH+AM
jperl用に書かれたperl のソースコードを、Jcode.pmのみを使って書き換えるにはどうしたらよいでしょうか? 日本語を処理する部分のみを、Jcode::eucなどを使って書き換えてあげればそれだけですむのでしょうか。 もともとかかれたソースコードは、jperl -Leucのオプションを使って起動させるものです。よろしくお願いいたします。
あるパターンで囲まれたテキストだけ、サブルーチンにかけて処理を施す ような事は、どのようにすれば良いのでしょうか? 例えば、 「aaa bbb ccc [change]ddd[/change] eee fff」 というテキストがブラウザから送られて、この [change]…[/change] に囲まれた部分だけに &kaeru() という処理を施す。そして全文を返す。 もし&kaeruがescape sequenceに変換する処理なら、 「aaa bbb ccc ??? eee fff」 というテキストを返したいのです。
316 :
訂正 :03/01/22 06:13 ID:???
最後の???は 「aaa bbb ccc &#224;&#224;&#224; eee fff」 です
>>314 今はPerl5.8を使った方がより少ない手間でjperl用のscriptを書き換えて
使うことができる。MS-Windows or LinuxならActivePerl build804.
まず、perlをインストールしたディレクトリのhtml/index.htmlを開いて
Encodeとencoding pragmasを読め。以下は例。
---^ test.txt
あいうえお
---$
use Encode;
use encoding "Shift_JIS";
open my $file, "<:encoding(Shift_JIS)", "test.txt";
while (<$file>) {
print;
chomp;
my @check = split //;
for my $s (@check) {
$s =~ s/う/ウ/;
print $s,"\n";
}
}
close $file;
318 :
nobodyさん :03/01/22 07:55 ID:q2TbMzAT
SSIで表示させようと以下のようなものを入れたのですが、なぜか表示されませんでした・・・ <!--#config timefmt="%m/%d" --> 他のSSI(カウンター)は動くのですがこれだけダメでした。 <!--#echo var="DOCUMENT_NAME"--> これはちゃんと表示しました。 もし解られる方がいらっしゃいましたらよろしくお願い致します
>>318 echo以外対応しないとか言うさーばも。
私は、 フォームなどで入力された文字をまず eucにして処理(ファイルに保存や正規表現にかけるなど) そしてクライアントに返す寸前にeucをsjisなどに変換して printしているのですが、 この場合、半角カナが送られてくると文字化けが起こってしまいます。 jcode.plにz2hなどの関数があるのですが、 半角は半角、全角は全角のままあつかいたいので、 なにかよい方法はありませんでしょうか?
322 :
bloom :03/01/22 09:06 ID:pcyTRh0d
>>320 入力された文字列で漢字コードを判別している限り無理。
Shift_JISの半角カタカナ2個はeuc-jpの漢字と判別される。
>>321 わけが分かっていないなら回答しないこと。
理由は上に書いた通り、utf-8に変換しようにも元の文字列の
漢字コードがわからない限り無理。euc-jpにも半角カタカナは
一応用意されている。
>>323 >入力された文字列で漢字コードを判別している限り無理。
ある程度の長さの文字列を読んでインテリジェントに文字コードを判別する文字コード変換ライブラリもそう珍しくはないが。
ShiftJIS文字255個にEUC漢字1個。これをEUCと判断するバカはいないわけで。
325 :
nobodyさん :03/01/22 09:33 ID:2Hn1813R
acitiveperl dev kit をアンインストしたらデバッガが起動しなくなりました C:\>perl -d -e '0' Unable to connect to remote host: 127.0.0.1:2000 Compilation failed in require. main::BEGIN() called at C:/Perl/lib/perl5db.pl line 0 eval {...} called at C:/Perl/lib/perl5db.pl line 0 BEGIN failed--compilation aborted. たすけてやってください
>>315 $hoge =~ s/\[change\](.+)\[\/change\]/&kaeru($1)/eg;
これでどう?
327 :
323 :03/01/22 10:47 ID:???
>>324 そうでしたか・・・
jcodeには euc2sjisとか
sjis2eucという的確なものもありますよね?
あれでやってもだめでしょうか?
以前は失敗したようなきがするけど、思い違いかなぁ
>>327 フォームから送られてくることが前提なら、hiddenでチェック用の文字を一つ送って、
判別するとかね。昔よくやったよ。
最近のブラウザは、フォームのページの文字コードで送ってくるから、
明示的に文字コード指定しても大丈夫だと思う。
あと、最近はFORMタグでも送信する文字コード指定できるようだ。
330 :
nobodyさん :03/01/22 12:27 ID:9ZZh+FcB
__END__
331 :
nobodyさん :03/01/22 13:15 ID:mr7EqnYJ
chomp($value) = $array[$i]; こういうやり方はダメですか?
$hoge = "abcd123456798\n123456789\123456789"; で $hoge に cd12 があればその列の\nまでを $hogeに入れたいのですが $hoge =~ s/.*(cd12.*)\n[.\n]*/$1/; こうするしかないのでしょうか?
$hoge =~ s/^.*(cd12[^\n]*)/$1/;
337 :
336 :03/01/22 14:43 ID:???
$hoge =~ s/(cd12[^\n]*)/$1/; で十分か。 cd12と聞くと、LINNの240万円のCDプレーヤーが頭に浮かぶわけだが
>>331 Can't modify scalar chop in scalar assignment
339 :
336 :03/01/22 14:58 ID:???
$hoge = $hoge =~ /^.*(cd12[^\n]*)/ ? $1 : $hoge; あーこうか
340 :
336 :03/01/22 15:00 ID:???
$hoge = $1 if $hoge =~ /(cd12[^\n]*)/; 何度も失礼...
>>336 サンクス そういう書き方ができるんですね。
342 :
nobodyさん :03/01/22 17:04 ID:0PCOHlDz
オブジェクトのハッシュ値にファイルを読み込むには、 $this=shift; $this->{fdata}=<パッケージ名::IN>; でいいの? $this->{fdata}[$nline] みたいにしてアクセスしたいんだけど・・・ これだとハッシュ値しか戻ってこない。
おっと、パッケージ名::INはファイルハンドルね。
344 :
246 :03/01/22 18:17 ID:STZ5+DSp
>>269 のスクリプトを使ってみましたが
shiftjis "\x87" does not map to Unicode at test.pl line 3, <$file> line 920.
や
shiftjis "\xFA" does not map to Unicode at test.pl line 3, <$file> line 154.
のようなエラーが出てしまいます。これはどういった意味なのでしょうか?
perl1行でgrepと同じ事する方法キボンヌ。 /(^.*key.*$)/$1/ じゃダメポ。 というのも、とあるテキスト書換えソフトでgrep出来たらいいなと。
>>345 なにがダメなのかわからん。
マルチポストもやめてくれ。
>>342 ハッシュ変数に配列をそのまま格納する事はできません。
配列変数のリファレンスを格納するか
その都度、無名配列を作成し、そのリファレンスからアクセスしてください。
348 :
kazu :03/01/22 19:04 ID:dkolKxk/
教えてください。 携帯サイトをやっているのですが、 index.cgiとhtaccessで機種の特定を行い、それにあったトップページに自動転送するというシステムをやっております。 i-modeで接続した場合に、「サイトが移動しました」という表示が出ます。 これを解決する方法はないのでしょうか?
>>348 index.cgiで出力結果をかえるとか。
350 :
kazu :03/01/22 19:09 ID:dkolKxk/
全然わからないんですが、どうやって出力結果をかえるんですか?
>>349 が言ってるのは、
index.cgi内で携帯ごとに違うページを表示するんじゃないかな。
index.cgi -> UA判別 -> UAに対応したページを出力。
>>348 がやってる方法は、
携帯ごとにディレクトリを別にして、index.cgiでそれぞれのディレクトリに飛ばしてるんじゃないかな。
自分で書いたヤツじゃないとか中身を理解していないなら、そのCGIの配布元のURLを出した方がいいよ。
てか、そのリダイレクト先の指定の仕方がマズイらしいな。
PCのブラウザだと
http:// 〜/dirname ってすると
http:// 〜/dirname/ になって
結果的に
http:// 〜/dirname/index.htm に辿りつけるんだが、
携帯だとしてくれねえヤツもあるらしいぞ。
振り分け先の設定をチェック汁
353 :
質問です。 :03/01/22 19:51 ID:H1d15TWe
すみません質問です。いま、携帯をキャリアごとに振り分けるcgiをつくってる んですが、うまくいきません。 httpヘッダで振り分けるスクリプトを組んで、PCでそのcgiにアクセスしてきた ときは「テスト」表示するように作ったのですが、エラー文も出てきてしまいます。 以下がブラウザに出てきた結果なのですが、どういうことでしょうか? CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are: テスト ソース自体が間違ってるのでしょうか? どなたか教えてください。
>>353 print("Content-Type: text/html\r\n\r\n");
355 :
nobodyさん :03/01/22 20:04 ID:NW1Un2Sy
>>348 機種にあったトップページに転送するんじゃなかったのですか?
なんでそうなるんですか?
356 :
質問です。 :03/01/22 20:35 ID:H1d15TWe
>>354 ありがとうございます。
うまくいきました。\nとか\rとかの意味がいまだにわかりませんが、
調べたほうがいいのでしょうね。
とにかく助かりました。ありがとう!
357 :
nobodyさん :03/01/22 21:14 ID:TWTRYmp3
あの、クソ初心者なんですけど、、、 CGIって拡張子のファイル(web上の)を他人が見ることってできないのですか? HTMLでもTXTでもJPGでも何でも普通ファイルの中身が返されますよね。 CGIの場合は実行結果しか絶対に返ってこないの?
359 :
nobodyさん :03/01/22 21:23 ID:TWTRYmp3
>>358 えっと、具体的にはどういう設定だとどうなるのですか?
>>359 CGI専用のディレクトリに入れていたり、CGIスクリプトとして実行するように設定された拡張子をつけていれば実行結果しか返されない。
それでもウェブサーバーを介さないでアクセスされたら覗かれるけどネ
Options +ExecCGI AddHandler cgi-script .cgi
>>360 >CGI専用のディレクトリに入れていたり
そのディレクトリに画像ファイルなんて入れたら大騒ぎだな。
>>361 Apacheの場合。と書かないと語弊があるぞ。
>>362 ForbiddenかInternal Server Error(実行権を与えていた場合)になるだけだろ。
365 :
nobodyさん :03/01/22 21:43 ID:TWTRYmp3
どの拡張子がCGIスクリプトとして実行すると決めておくのがサーバー設定ってことですか? WEBサーバーを通さないってことはFTPでってことですか? かなり初心者なんですいません。
>>365 >WEBサーバーを通さないってことはFTPでってことですか?
など、そのサーバのファイルシステムに然るべき権限でアクセス出来るプログラムがあればいい。
>>365 > どの拡張子がCGIスクリプトとして実行すると決めておくのがサーバー設定ってことですか?
そう
> WEBサーバーを通さないってことはFTPでってことですか?
別に何でもいい。FTPじゃ無理だと思うが。
たとえばis○ebのようにセキュリティの甘いところはCGIスクリプトを使って他人のファイルを覗ける
370 :
nobodyさん :03/01/22 22:08 ID:NkPjRdCp
>>368 お前には課題だ。調べておけ。
suEXEC setuid ファイルの所有者 パーミッション
>>370 >>367 の間違い?
それくらい知っているけど(^_^;)
共用サーバにも関わらずそれをやっていないからis○ebはセキュリティが甘いと言ったんだけど。
>>328 submitタグのvalueに漢字を使う手も。
374 :
nobodyさん :03/01/22 22:42 ID:TWTRYmp3
みなさん、ありがとうございました。
>>373 そうなんですか?それすらもよくわからなくて。
ごめんなさい。
本とかにはopenではよく or dieと組み合わせてありますが、 私の場合openが失敗したからといってスクリプトを終了させるわけ には行かないので if(open(IN,"temp.txt")){ opend lines } else { canto open lines } のようにしているのですが、 こういうことはしないのでしょうか?大丈夫でしょうか?
>>375 open(IN, "temp.txt") or { cannot open file }
378 :
375 :03/01/23 00:56 ID:???
ありがとうございます 376の方法もいいなとおもいました
379 :
nobodyさん :03/01/23 01:15 ID:IkRppvEj
ただ単にファイルをアップロードだけのCGIありませんか? クライアントからのデータをサーバに保存できさえすれば良いんですが。
半角文字、ダメです・・・シフトjisとeucだと確定していうるので 送られてくる→&jcode'sjis2euc(\$mes)→内部処理 内部処理→&jcode'euc2sjis(\$mes)→送り返す としても、半角はおかしくなってしまいます。 なにか解決方法はないでしょうか><
382 :
nobodyさん :03/01/23 01:56 ID:8ePVO3RC
ファイルを開いて内容を配列に収めて配列要素を追加するなり並べ替えるなりしてまたファイルに書き出したら、次に開いたときに各要素の頭(単純にファイルを開いた場合は各行の先頭)に半角スペースが付いてるの。 2回同じことやれば半角スペースが2つ、3回なら3つって具合にどんどん増えてしまう。 なんで? どうやったら回避できるの? 何か根本的なこと間違ってる?
>>380 そもそも「半角カナは文字化けするから使わないように」っていうのがネットの常識じゃなかったか?
2chみたいに、半角カナが堂々と使える掲示板のほうが特殊なのかもしれないぞ。
>>382 ソースきぼんぬ
384 :
380 :03/01/23 02:19 ID:/gwtZ2Vt
>>381 ありがとうございます!
\$ を * にしたらなりました
昔は*を使っていたのですが、\$のほうがいいとか、同義だと
かおもっていて、結果が違うとはおもいませんでした。
*$とうのもあるのですか?
私もまだまだ勉強不足ですね・・
ありがとうございました。
385 :
380 :03/01/23 02:28 ID:???
なんか、ポートがどうとかいわれて書き込めなかった。。
今度は大丈夫かな
>>383 そうなんです。私も半角はいやなのですが、
携帯電話のチャットを作っているので、きってもきれない
関係なんです・・
掲示板で使えるところがあるので、どうにかがんばればできるんだろうなぁ
とか思ってやってました。
文字コードを変換しなければ問題はおこりにくいのかな
2chは書き込みボタンのキャプションの文字コードを調べて SJIS以外なら、エラーを返して書き込めないようにしている。 結果として、文字コードの変換処理を省略している。 PC向けならこれで、問題ないように思える。 基本的に、フォームページの文字コードでデータがPOSTされれば 変換処理はいらないと思う。 携帯の場合はどうなんだろう。。ちと気になる。。
>>385 携帯ならShiftJISだけで処理すればいいんでない?
半角カナOKな掲示板も、内部ではShiftJISだけで処理してるのがほとんどだよ。
388 :
nobodyさん :03/01/23 02:46 ID:j5CbC/3T
>>383 382です。ソースはかいつまむと
#!/usr/local/bin/perl
print "Content-type: text/html\n";
print "\n";
print "<HTML>\n";
open(FILE,"<data.txt");
@data=<FILE>;
close(FILE);
open(FILE,">data.txt");
print FILE "@data\n";
close(FILE);
print "処理終了\n";
exit;
こんなんです。
これだけでもどんどんスペースが増えていきます。
なんででしょう?
389 :
380 :03/01/23 02:49 ID:???
みなさん、ありがとうございます。 本来はshiftjisだけで処理したほうがよかったかもですね。 私の場合は、メッセージにIDや名前や発言があるので それを切り分けたりとか、サーバー側がつくったメッセージを くみあわせたりとかがあるので、つい、 サーバー側(UNIX+Apache)ではEUCで扱うようにクセがついています。 半角文字に関しては今のところうまく動いているので、 もしある程度出来上がったらiappliのお金がかかりにくいように 作ったチャットをここで公開しますね
>>389 かいつまみすぎてわからん。それだけ見れば異常はないけど、
配列の最初の要素にどういうものをいれているんだ?
print "$data[0]syori syuuryou";
とかでみてみた?
391 :
nobodyさん :03/01/23 03:17 ID:j5CbC/3T
>>390 えっと私(382=388)へのレスということでいいですよね。
データの内容は会員リスト(氏名だとか住所だとか電話番号をカンマ区切りにしているもの)です。
拡張子はtxtですがためしにcsvとかでやっても同じでした。
data.txtのファイルをブラウザで見ると2つ目以降のデータの頭にどんどん半角スペースがくっついていくんです。
csvにした場合は2行目以降の1列目の各データの頭にスペースが付いていきます。
本当は配列に入れた後、追加だとか並べ替えだとかやりたいんですけどそれ以前の段階でつまづきました。
392 :
390 :03/01/23 03:28 ID:???
>>391 改行コードの違いとかはだいじょうぶ
ファイルをどうやってみてるのかとかわかんないしなぁ
やまだ,東京345,99311
のだ,宮556,552211
見たいな感じなの?
>>391 こうすると直るよ。
print FILE "@data\n";
↓
print FILE @data;
394 :
nobodyさん :03/01/23 03:37 ID:j5CbC/3T
395 :
nobodyさん :03/01/23 03:42 ID:j5CbC/3T
わ、わ、わわわ! 本当だ! ありがとうございます。(^^) 凄い晴れやかな気分。半日苦しんだから。 でもなんだか恥ずかしくなってきた。 受け売りって言うかよそから拾ってきたものを見本に猿まねで訳もわからず作ってたから。 ところで何でこうなるんですか? (by 382)
396 :
393 :03/01/23 04:10 ID:???
>>395 調べてみたんだが、ダブルクォート中にリスト変数を記述すると、リストの中身が
展開されるそうな。そのとき区切り文字として特殊変数 $" が使われるんだけど、
この中身はデフォルトでは半角スペース。
例えば、各行が「うんこ」「ウンコ」「unko」のテキストファイルを読み込む。
@data = <FILE>;
すると、$data[0] は「うんこ\n」、$data[1] は「ウンコ\n」 などとなる。
これを間違ってた方法で書き出すと
print FILE "@data\n";
リストが展開され、「うんこ\n ウンコ\n unko\n\n」となる。
結果、2行目以降の先頭にスペースがついてしまったというわけ。
(@dataの後ろの\nが実は末尾にしか付いていないことにも注目)
リストの出力は print FILE @data; のようにダブルクォートせずに書こう。
397 :
390 :03/01/23 04:12 ID:???
>>396 そうそう。おれはそれが言いたかった。
変わりにかいてもらってスマソ
CGIでメール送信プログラムを組んでおります。 require "mimew.pl"; require "jcode.pl"; (略) $subject = mimeencode (jcode'jis($subject)); $body = jcode'jis($body); open(MAIL ,"|/usr/sbin/sendmail -t -i"); print MAIL "From: $MailAddress\n"; print MAIL "Subject: $subject\n"; print MAIL "To: $mailaddress1\n"; print MAIL "\n"; print MAIL "$body\n"; close(MAIL); で、コマンドラインから実行した場合は正常にメール送信されるのですが、 ブラウザ経由で実行した場合、mimeencodeが実行されません。 (エラーにもなりません。) mimew.plおよびjcode.plはプログラムと同階層においてあります。 また、ファイルの属性は755です。 八方塞がりの状況です。教えていただけませんでしょうか。
>>398 .plのパーミッションは普通 644 or 604 だよ。それはOK?
400 :
nobodyさん :03/01/23 11:13 ID:xJWtHdWY
sub hoge{ my %aaa; my @bbb; # それぞれになんか値を入れる動作する return(%aaa,@bbb); } (%AAA,@BBB) = &hoge; こうすると@BBBに値が入ってないんですけど、なぜでしょうか。
401 :
398 :03/01/23 11:19 ID:???
>>399 mimew.plのパーミッションは644です。
apacheのログを見たところ、
Undefined subroutine &mimew::mimeencode
と表示されていました。
mimew.plにはmimeencodeが存在しています。
(コマンドラインからは実行されますし)
何か他にチェックするべき点はあるでしょうか。よろしくお願いします。
>>398 もしも、mimew.plが読み込まれていないと心配なら
eval ( require "mimew.pl" );
で、きちんと読み込まれているかチェックしてみたら
どうでせう?
>>399 0755にしなきゃいけないファイルを0644にしていたら問題だけど、
普通0644にするべきファイルを0755にしていても、問題じゃない
でそ?
403 :
nobodyさん :03/01/23 11:35 ID:E5MYBiOX
>>400 my @AAA=&hoge;
%AAA=$AAA[0];
@BBB=$AAA[1];
404 :
398 :03/01/23 11:56 ID:???
>>402 evalでチェックを行ったところ、
mimew.plはきちんと読み込まれていました。
しかし、あいかわらず
Undefined subroutine &mimew::mimeencode
と出力されています。
>>400 returnは値を1つしか返せないよ。
こういうときはリファレンス渡しにして、サブルーチン側で直接値を変更したほうが
いいかもしれない。
&hoge(\%aaa, \@bbb);
sub hoge {
my ($aref, $bref) = @_;
$aref->{hage} = "ccc";
$bref->[0] = "ddd";
}
>>398 バッファリングしないようにすれば動く。
例えば単純変数や配列変数を使う時、 1.作業用の配列を使いまわす事がある 2.分かり易いように名前を決めて、1つの項目しか入れない 場合によって、違うかもしれないけど、貴方はどっち派?
408 :
390 :03/01/23 13:00 ID:???
>>407 おれは2
今の時代、よっぽど負荷がきになるときいがい
2にして、わかりやすいソースを書いたほうがマシ
409 :
nobodyさん :03/01/23 13:13 ID:nFHVv77n
CGI経由でファイルを作成しようと思い、 実験として次のソースを書いてみました。 ファイル名:test1.cgi #!/usr/local/bin/perl open(FILE,">>./1234.txt"); print FILE "0123456789\r\n"; close FILE; これをFreeBSD4.7+apacheが動いているコンピュータにいれて 別のコンピュータにブラウザでこのファイルのアドレス を指定してやると「内部サーバーエラー」が出てしまいます。 何か間違いがあるだろうかと、 apacheが動いているコンピュータで直接 perl test1.cgiとやったところ、1234.txtのファイルが作成されました。 ネットで調べたところ、Apacheのユーザに権限がないと ファイル作成などはできないということが書いてあったのです、 1234.txtが作成されるディレクトリのパーミッションを775にして、 apacheのユーザを、そのディレクトリのグループのユーザに 加えてみて、今度はapacheのユーザでperl test1.cgiを実行しました。 そうしたところ、上手く作成できたので、今度は外部から試してみました。 そしたらやっぱり内部サーバエラーになってしまうんです。 どこがまずいのか分かりません。 乱文になってしまいましたが、どなたか私の間違いを 指摘して下さいませんか?よろしくお願いします。
>>409 print "\r\n\r\n";を加えれば動くでしょう。
411 :
nobodyさん :03/01/23 13:25 ID:jz3+5dSU
>>409 Apacheにヘッダーを送れ。
print "Content-type:text/plain\n\nファイル作成しますた。\n";
412 :
409 :03/01/23 13:28 ID:???
>410さん #!/usr/local/bin/perl print "\r\n\r\n"; open(FILE,">>./1234.txt"); print FILE "0123456789\r\n"; close FILE; というふうにしてみたんですが、今度はダウンロードしますか?の ダイアログが出てきてしまいました。どうなってるんでしょうか?
ダイアログが出たということは、正常に動作しています。
PerlをCGIで動かす場合には、HTTPヘッダを出力する必要があります。
CGIで動かした時にHTTPヘッダがなければ、
>>409 のようにエラーで動きません。
それだけです。
414 :
398 :03/01/23 13:46 ID:???
>>406 申し訳ございません。
おっしゃる意味が分からないのですが・・・。
415 :
nobodyさん :03/01/23 13:54 ID:Ah3Ym1t7
質問します。
文字列中に
#1234(1234は3〜6桁の数字)
と有った場合、
<a href="
http:/hoge.com/hoge/1234 ">#1234</a>
~~~~~ ~~~~~~~
#を外した数字↑ ↑元の文字列
と言う風に変換したいのですが、上手くできません。
どなたかご教授ください。
よろしくお願いします。
>>414 プログラム的に説明すると、$|=1;を先頭の方に加える。
バッファの意味は辞典なり検索なりして調べてください。
>>415 こ、今度だけだぞ
my $str = "#1234(1234は3〜6桁の数字)";
(my $tr = $str )=~ s!(#(\d{3,6}))!sprintf("\"
http:/hoge.com/hoge/$2\ ">$1</a>")!ge;
print "$str ->\n$tr\n";
>>417 おっと、いけねぇ、ミスってもうたわい。まっ、いいか。
420 :
398 :03/01/23 14:47 ID:???
>>416 出力バッファを吐き出すことと、
サブルーチンが見付からないこととはどのような関係があるのでしょうか。
$|=1;を加えてみましたが、結果はかわりませんでした。
ただ、気になるのですが、
$subject = mimeencode(jcode'jis($subject);
と呼び出した場合、
Undefined subroutine &該当コードが含まれているパッケージ名::mimeencode
とエラー出力されます。
mimew.plは正常に読み込んでいるようなのですが・・・。
421 :
398 :03/01/23 14:52 ID:???
ちなみにjcode'jisは正常に呼び出せています。
422 :
nobodyさん :03/01/23 15:03 ID:Ah3Ym1t7
>>421 mimew.plのエラーじゃないだろ。冷静になってよく考えろ。
>>398 だから、なんでアホみたいにprint MAIL なんとか
でやるの?バッファリングするなっていわれてるのに
$mess にぜんぶメールいれといて
system (,"|/usr/sbin/sendmail -t -i , $mess);
かなんかでポンとやれよ。
ファイルハンドルの意味わかってんの?
426 :
398 :03/01/23 15:28 ID:???
解決しました。 mimew.plを見たら、パッケージ名がMIMEと設定されていました。 呼び出しミスでした。お騒がせ致しました。 ただ、jcode.plの場合はrequireするだけで良かったって言う、理由が、よくわからないままです。 よろしければご教授ください。
>>426 mimew.plのあたまのほうは?
おれはrequireするだけでうごいてるけど
>>426 あんたのmimew.plにmain'mimeencodeサブルーチンが欠けているか
main以外のパッケージ空間を使用しているからでしょ。。
429 :
426 :03/01/23 15:46 ID:???
>>423 ,425,427,428
ありがとうございました。
がんばります。ごめんなさい。
430 :
nobodyさん :03/01/23 17:27 ID:kDsUWLbm
>>406 >>416 >>425 今回の問題にバッファリングは関係ない。closeしているから。
なんでも$|=1って書けばいいものじゃない。あほか。
431 :
nobodyさん :03/01/23 17:34 ID:kDsUWLbm
もしMAILに対してバッファリングをしないように設定したいのであれば、 select(MAIL); $| = 1; select(STDOUT); こうするべき。この辺りはわかって言ってるんだよね?
432 :
409 :03/01/23 18:06 ID:???
>>411 さん,
>>413 さん,
>>424 さん
ありがとうございます。上手く動きました。
何度試してもずっと内部サーバエラーですが出力されていたのですが、
ブラウザを閉じてもう一度アドレスを入力したら動きました。
なんだかふに落ちないのですが、ひとまず動いたのでよしとします。
一時ファイルとかそんなのが問題になってるんでしょうかね?
そうですね。
434 :
nobodyさん :03/01/23 19:02 ID:0ikp7K62
モジュールをwinxpでインストールしたいのですが 解説書などを見ても意味がわかりません。 $su が最初に出てくる画面は何のアプリを使ってるのでしょうか?
435 :
nobodyさん :03/01/23 19:26 ID:/BytM6mn
>>434 Linux
FreeBSD
cygwin
437 :
nobodyさん :03/01/23 22:30 ID:CHeIi8Oa
会社のネットワークからだと、 制限かかってて見れないページがあるんですが、 自宅のwebサーバーを経由して、見れるようにする 方法ってないでしょうか?
438 :
nobodyさん :03/01/23 22:33 ID:vGzRwfzk
439 :
nobodyさん :03/01/23 22:42 ID:JsPmMcCV
文字列を、ある文字コード分だけずらすには どうすればよいのでしょうか? $char = "ABcd"; 何らかの処理 (例えば +10hさせる。) ↓ $char が QRst となる。 文字を取り出すのはやってみたんですが、 文字をずらすのがわかりませんでした。 -------------------------------- $char = "ABcd"; for ($i = 0; $i < length($char); $i++) { $c = substr($char, $i, 1); } --------------------------------
440 :
nobodyさん :03/01/23 22:51 ID:KCPQ5bMl
441 :
438 :03/01/23 22:54 ID:???
>>440 そうやると$cに数字の10が入ってしまうんですけど・・・
442 :
439 :03/01/23 22:55 ID:???
↑失礼 ハンドル間違えました。
443 :
440 :03/01/23 22:59 ID:KCPQ5bMl
$c++; を必要なだけ繰り返す。
445 :
nobodyさん :03/01/23 23:10 ID:CHeIi8Oa
>438 串刺すとみれるんですか? .pacのファイルを指定してプロキシ経由してるんですが、 その辺よく分からないので、よろしかったらご指導ください。。
>>437 俺も会社からちくり板見るれなくなって欲求不満だった。
だから某所のコード改造してから自作したよ。
これでもパーラーだからねピュアperlで作った簡単httpポートフォワーダだよ。
>>446 ---この下から---
begin 666 http-tmp2ch.zip
M4$L#!!0````(`&F_-RZKG&Q7[0,```<*```.````:'1T<"UT;7`R8V@N<&R5
M5FUOVD@0_FQ^Q90XQ:A@`]%))R,XI6W:1,H!"MR+5!IDS!*LFK5O=PF'0OK;
M;V=?,'"D:E8"KW>?F7EV=N:!LS?!BK,@S>(H#:8)#7+"TM+90HB\+I9Y"]0L
MSYB`><;6$9L1!N\W<.V+[!O)-#(,@D6V)'GT0"Y\FLS%QH^S9:`0-+BB#_7W
M06G%"7#!DEBTU?RF'X;#+/Y&]M])2G!_N0'W]G(V8]`!]_+N\Y]?&E_AMV(:
M0D4Q7F1<5`Q\@!PMO(EP\ABEGGVOHE%+#H,?74O;';Y5N&\I]_+L?BM>^)2(
M"AB+@P@71Q$N=(1?&PC/64(%E,<4LP."193#S2":S4)SK-N$"T)#PUH#D%!H
M>.%RJ"..:5G'3Y7-)#<LE*G>X3*-DW64B(0^R*TBLV%XT[L:U;N4K#T=$N3H
M=&'8__WR[P_]7J]6@I\=MYAQG8/N`9M7^!BP3&1J)GU41)Q77F%\1[!.<$CC
MYFN9ZW+JFL*JP<^;5]NE]2))"7@VV9C__:37NU$<DUQ4GY17"?/<Z6I><QGY
M9T6XD!X<Y<)K5N&IY#A\PQF)9I[R4@,%AF9##@FU<:TU^!V%*':2.7C%=N<[
M+(,Q&U/\;.6#!F"8_,#@WAOTAZ/MYZM1%13>D4,QQZZ2G-35@BMK9R(-:RY'
MKG@2.:06>#Q/$^%5QK12G%.?3HY`57,`;]_"++.+CCOI0$7M0,4WI:X=.L_F
M&=R1.6&$G;+]SK=&;K[<!U_?V1?M:)L=>;+,5?HFONS&L@GV7)R5F5,F$1:%
MFQ/"T%G5('<+]L;K75RAT9(8Q)&+J@0B#N>3A'J%Q[8-JI8F"^WT@0B<33=H
MX!D:</EI@HU[;!-I14RD*$VHR"*#-S!]09V&>3,!#K+L6O'06M8^J!'CX$4!
M00_@.`/)9-=+JE0..TDC=CIQ0B`DPLK`:15PJD?,5/F^`4/PJ+81X&C%U<U9
MOAZ-!D'3;\`OC0;$$:69`$9XECX2'WND?.`>ZT$]U9RD4F.>#O<=KGZ7/-L"
MX&X[S3:8U>'H8_^/4?7(YXZ1HF1K\1BTJU'9DCRX#P""A^5I3V6`>AUL"W,1
M,5&O__\L-NX+`4_Y(G1F/#FVW+B4&]A[1[%*Y:^'<J=6=RGY4484TH0\/S__
MBTREB$<S&")[DYLB\(%"JG*U8=_)IMHIII%,7FBF%$TP)OMUH"#(6&^M:$HX
M]]1J$<-)HT*$L!+,\R7J5[V/>\1A3T_B-./$U@BTS]!D2-BC_,.$S00?<+^D
MT38HP#-^F:+;!>R1?[%B9;@YRY8P9=F:$V8R17&S[6ACO%;]77#5D21=?;U#
MG0N;:L1:JEK0GTNE_P!02P$"%``4````"`!IOS<NJYQL5^T#```'"@``#@``
M```````!`"``MH$`````:'1T<"UT;7`R8V@N<&Q02P4&``````$``0`\````
&&00`````
`
end
---この上まで----
449 :
nobodyさん :03/01/24 00:28 ID:f7nkT00I
>>439 $char="ABcd";
print pack("C*",(map { $_+10 } unpack("C*",join('',$char))));
別に1行でなくてもよいけれど、、、
451 :
449 :03/01/24 00:35 ID:???
join('',$char) を $char に訂正。 無意味だ欝
>>439 my $char = "ABcd";
$char =~ s/(\w)/chr(ord($1) + 0x10)/ge;
print $char; # > QRst
私はこういう方法で偶に変換してます。。
Configuration Error The server encountered an error while processing your request. Please contact the administrator of the referring document and inform them of the time the error occurred, and anything you might have done that may have caused the error. -------------------------------------------------------------------------------- The CGI environment at the time of this error was こんなのが表示されたんですがどうすればよいでしょうか?
>453 ちゃんとローカルでテストしましょう。 そのエラーメッセージじゃ何もわからんよ。 まずはローカルでテストできる環境を作って、そこでエラーメッセージをちゃんと吐かせる。 そしてエラーメッセージの意味を調べて、スクリプトを修正する。
455 :
439 :03/01/24 01:13 ID:???
>>449 ,452
ありがとうございます。
今までネットで探していたら、
452さんも使われているchr関数を見つけましたので
一端ordで変換してchrで戻してみました。
449さんも使われているpackも見てたのですが、
ちょと私にはまだ難しかったみたいです(^^;
>>453 453の:とるにたらない人さん:03/01/24 01:06ID: ???
Configuration Error
コンフィギュレーションエラー
The server encountered an error while processing your request.
あなたのリクエストを処理する間に、サーバーはエラーに遭遇しました。
Please contact the administrator of the referring document and inform them of the time the error occurred, and anything you might have done that may have caused the error.
どうか指名しているドキュメントのアドミニストレーターと連絡を取って、そして(彼・それ)らにエラーが起こった時とエラーを起こしたかもしれないあなたがしたかもしれない何でも知らせてください。
>>457 よくわからいので初心者でもわかるように説明してもらえないでしょうか?
お手数かけます
>456 あんたのパソコン。 サーバー上でCGIのテストするな。 後は検索して調べな。 説明ページは探せばいくらでもある。 それ読んで分からないようなら、CGIの改造とか色々考えるな。 改造せずにそのまま設置しようとしてそのエラーなら、配布元の指示に従ってちゃんと行動してないって事。 とにかく書いてある文字を読め。
>>456 自分のパソコンにPerlをインストールして、それで走らせて
デバッグする。WinでもMacでもあるよ。
これって2ch掲示板のことじゃ・・・・
462 :
nobodyさん :03/01/24 14:56 ID:Mw0EqohX
463 :
nobodyさん :03/01/24 15:21 ID:8KdGKoGc
検索フォームから、例えば何らかのperl関数を入力された場合、 CGIが暴走するということはありえるでしょうか?
>>464 evalなんてバカな関数使ってるならそれなりにありえる。
まああれだ、好きな音楽を聴きながら仕事している方が効率いいな。 おまえらはどうだ?
>>467 集中したい時は耳栓するぞ。
そうすると呼吸の音が気になってくるんだなこれが。
息止めろ。
>467 簡単な物は音楽が鳴っていた方がいい。 複雑な物になると鳴ってない方がいい。
473 :
467 :03/01/24 17:33 ID:???
{解決] よく考えると俺も472さんと一緒だな。 無音は気持ち悪くて、流石に嫌だけど。
474 :
nobodyさん :03/01/24 17:43 ID:i/64hvW7
wwwmailを使ってメール送信フォームを作ったのですが このように表示されます。 下記のメールを送信しました。ありがとうございました。 -------------------------------------------------------------------------------- Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit MIME-Version: 1.0 To: aaa@aaa From: aaa@aaa Subject:wwwmailからのメール 氏名 = 住所 = といった感じなのですが 「下記のメールを〜」の下にそのまま「氏名=」と来たほうが 送信した側もわかりやすいように思うのですが 「Content-Type:〜Subject:wwwmailからのメール」までを 消す(送信者に見えなくする)方法はありますか? よろしくお願いします。
ソース見せて (*´д`)ハァハァ
>>474 これあぶねーな まだこういうの作ってる人いるんだ。
こえー。大丈夫?責任とれるのかな
>>474 print のところをはずせばいいだけだとおもうが。
でもあぶねぇなぁ。こんなの本当に設置すんの?
478 :
474 :03/01/24 18:12 ID:i/64hvW7
皆さんレスありがとうございます すみません、どんな風に危ないんでしょうか? 非常に不安になってきたのでよければ詳しく教えてくれませんか??
誰でも何処でも何通でも送れるから。
ソース見せて (*´д`)ハァハァ
>>474 設置した場所にBASIC認証かけておいてね。
危ないかどうかはソース次第だとおもうけど。 ただ、Toを自分のメアドにしておいてもメールボムとか怖い。
485 :
474 :03/01/24 19:43 ID:i/64hvW7
すみません初心者なのでソースを出して良いのかどうかの 判断がつきません。wwwmailは「とほほ」にある メール送信フォームを設置するためのソフトです。 危険でしょうか?
とほほは危険
>>485 個人情報(自分のメアドとか)、パスワードとかが入ってるなら、それだけ消してソース出してみ。
ソース見せたくらいじゃどうってことないよ。
488 :
nobodyさん :03/01/24 20:13 ID:QLwP0ckk
xreaに12chのスクリプトを置いたのですがどうも書き込み後、index2.htmlに戻るときエラーが発生してしまいます。 たしか、XREA用に何かいじらなければならなかったような気がするのですが思い出せません。 どなたかご存知の方、ご教授願います。
490 :
488 :03/01/24 20:20 ID:???
491 :
474 :03/01/24 20:27 ID:i/64hvW7
ソースです。
#!/usr/local/bin/perl
#=====================================================================
# カスタマイズ
#=====================================================================
# ★ perlのパス名
# このファイルの先頭の1行を、あなたが利用するサーバーにインストー
# ルされた perl コマンドのパス名に応じて変更してください。例えば、
# 私が加入している BIGLOBE では、#!/usr/local/bin/perl となります。
# 解らない場合は、プロバイダやサーバの管理者にお問い合わせください。
# 「#!」の前には、空文字や空行や他の文字がはいらないようにしてください。
# ★ 送信先メールアドレス
# $mailto = '
[email protected] '; のようにあなたのメールアドレスに
# 書き換えてください。
$mailto = '';
# ★ サブジェクト(件名)
# 送信されるメールのサブジェクトを指定してください。
$subject = 'WwwMailからのメール';
# ★ メール送信コマンド
# WebサーバーがUNIXの場合はsendmailコマンド、Windows系の場合はBLATJ.EXE
# コマンドのパス名を指定($mailcmd = 'C:\BLATJ\BLATJ.EXE'; など)してく
# ださい。このコマンドが存在しない場合は、WwwMail は動作しません。また、
# 存在していても、メール送信の設定が行われていない場合があります。詳細
# はプロバイダやサーバーの管理者にお問い合わせください。
$mailcmd = '/usr/lib/sendmail';
492 :
474 :03/01/24 20:28 ID:i/64hvW7
# ★ 送信結果メッセージ(ヘッダ) # <<END_OF_DATA 〜 END_OF_DATA の間を好みにあわせて変更してください。 $header = <<END_OF_DATA; <html> <head> <meta http-equiv="Content-type" content="text/html; charset=Shift_JIS"> <title>メール送信結果</title> </head> <body> <h1>メール送信結果</h1> <hr> <p>下記のメールを送信しました。ありがとうございました。</p> <hr> END_OF_DATA # ★ 送信結果メッセージ(フッタ) # <<END_OF_DATA 〜 END_OF_DATA の間を好みにあわせて変更してください。 $footer = <<END_OF_DATA; <hr> <a href="../index.htm">[戻る]</a> </body> </html> END_OF_DATA
493 :
474 :03/01/24 20:29 ID:i/64hvW7
#====================================================================
# 自己診断機能。
#====================================================================
# メール送信がうまく動作しない時に、
#
http:// 〜/〜/wwwmail.cgi?test の形式で呼び出してください。
if ($ENV{'REQUEST_METHOD'} eq "GET") {
print "Content-type: text/html; charset=Shift_JIS\n";
print "\n";
print "<html>\n";
print "<head>\n";
print "<title>WwwMail自己診断</title>\n";
print "</head>\n";
print "<body>\n";
print "<p>CGIは正常に動作しています。</p>\n";
unless (-f $mailcmd) {
print "<p>$mailcmd がありません。</p>\n";
}
unless (-x $mailcmd) {
print "<p>$mailcmd が実行可能ではありません。</p>\n";
}
unless (-f "jcode.pl") {
print "<p>jcode.pl がありません。</p>\n";
}
unless (-f "mimew.pl") {
print "<p>mimew.pl がありません。</p>\n";
}
print "</body>\n";
print "</html>\n";
exit 0;
}
494 :
nobodyさん :03/01/24 20:30 ID:i/64hvW7
#==================================================================== # 本体 #==================================================================== # # ライブラリの呼び出し # require "jcode.pl"; require "mimew.pl"; # # 入力値を読み取る # if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); @a = split(/&/, $query_string); foreach $x (@a) { ($name, $value) = split(/=/, $x); $name =~ tr/+/ /; $name =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*name, "jis"); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $value =~ s/[\r\n]+/\n/g; &jcode'convert(*value, "jis"); if ($FORM{$name} eq "") { $FORM{$name} = $value; $FORM[$cnt++] = $name;
495 :
nobodyさん :03/01/24 20:31 ID:i/64hvW7
} else { $FORM{$name} .= (" " . $value); }}} # # EMAILが正常なメールあどれすかどうか判断する # if ($FORM{'EMAIL'} =~ /^[-_\.a-zA-Z0-9]+\@[-_\.a-zA-Z0-9]+$/) { $mailfrom = $FORM{'EMAIL'}; } # # メールヘッダを作成する # { &jcode'convert(*subject, "jis"); $mailhead = ""; $mailhead .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n"; $mailhead .= "Content-Transfer-Encoding: 7bit\n"; $mailhead .= "MIME-Version: 1.0\n"; $mailhead .= "To: $mailto\n"; if ($mailfrom) { $mailhead .= "From: $FORM{'EMAIL'}\n"; $mailhead .= "Cc: $FORM{'EMAIL'}\n"; } else { $mailhead .= "From: $mailto\n"; } $mailhead .= "Subject: $subject\n"; $mailhead .= "\n";}
496 :
nobodyさん :03/01/24 20:33 ID:i/64hvW7
# # メールボディを作成する # { for ($i = 0; $i < $cnt; $i++) { $mailbody .= "$FORM[$i] = $FORM{$FORM[$i]}\n"; } # "." のみの行は ". " に変換する。 # 2回繰り返さないと、2行連続で "." のみの行に対応できない # "." を ".." に変換する処理が一般的だそうだが、あえて、 # "." を ". " に変換する。 $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g; $mailbody =~ s/(^|\n)\.(\n|$)/$1. $2/g;} # # メールを送信する # if ($mailcmd =~ /sendmail/) { unless (open(OUT, "| $mailcmd -t")) { &errexit("メールの送信に失敗しました。(1)");} unless (print OUT &mimeencode($mailhead)) { &errexit("メールの送信に失敗しました。(2)");} unless (print OUT $mailbody) { &errexit("メールの送信に失敗しました。(3)");} close(OUT); } elsif ($mailcmd =~ /BLAT/i) { &jcode'convert(*subject, "sjis"); $cmd = "$mailcmd"; $cmd .= " -"; $cmd .= " -t $mailto"; $cmd .= " -s \"$subject\""; if ($mailfrom) {
497 :
nobodyさん :03/01/24 20:35 ID:i/64hvW7
$cmd .= " -c $mailfrom"; $cmd .= " -f $mailfrom";} unless (open(OUT, "| $cmd > NUL:")) { &errexit("メールの送信に失敗しました。(4)");} &jcode'convert(*mailbody, "sjis"); unless (print OUT $mailbody) {&errexit("メールの送信に失敗しました。(5)");} &jcode'convert(*mailbody, "jis");close(OUT);} else {&errexit("メール送信コマンド $mailcmd が存在しません。");}
498 :
nobodyさん :03/01/24 20:36 ID:i/64hvW7
# # ブラウザ画面に送信結果を書き出す # {&jcode'convert(*header, "sjis"); &jcode'convert(*footer, "sjis"); $mail = $mailhead . $mailbody; &jcode'convert(*mail, "euc"); $mail =~ s/&/&/g; $mail =~ s/"/"/g; $mail =~ s/</</g; $mail =~ s/>/>/g; $mail =~ s/\n/<BR>/g; &jcode'convert(*mail, "sjis");print "Content-type: text/html\n"; print "\n"; print "$header\n"; print "$mail\n"; print "$footer\n"; } # # エラーメッセージを出力して終了 #
499 :
nobodyさん :03/01/24 20:36 ID:i/64hvW7
sub errexit { local($err) = @_; local($msg); $msg = "Content-type: text/html\n"; $msg .= "\n"; $msg .= "<html>\n"; $msg .= "<head>\n"; $msg .= "<meta http-equiv=\"Content-type\" content=\"text/html; charset=Shift_JIS\">\n"; $msg .= "<title>メール送信結果</title>\n"; $msg .= "</head>\n"; $msg .= "<body>\n"; $msg .= "<h1>メール送信結果</h1>\n"; $msg .= "<hr>\n"; $msg .= "<p>$err</p>\n"; $msg .= "<p>ブラウザの [戻る] ボタンで戻ってください。</p>\n"; $msg .= "<hr>\n"; $msg .= "</body>\n"; $msg .= "</html>\n"; &jcode'convert(*msg, "sjis"); print $msg;exit(0);} 長くて申し訳ないです。どうでしょうか?
全部キタ━━━━━━(゚∀゚)━━━━━━ !!!???
>>499 そこまでやるなら別ファイルにした方がWYSIWYGなエディタで編集出来るし便利だと思うんだが。
ちゃんと読んでないが、メールの本文に目障りな文が入るってことじゃなくて、 ブラウザに表示される画面をどうにかしたいってことか?
503 :
474 :03/01/24 21:12 ID:i/64hvW7
>>502 そうなんです。
送信しましたの画面で(この下は474のコピペです)
下記のメールを送信しました。ありがとうございました。
--------------------------------------------------------------------------------
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
To: aaa@aaa
From: aaa@aaa
Subject:wwwmailからのメール
氏名 =
住所 =
といった感じなのですが
「下記のメールを〜」の下にそのまま「氏名=」と来たほうが
送信した側もわかりやすいように思うのですが
「Content-Type:〜Subject:wwwmailからのメール」までを
消す(送信者に見えなくする)方法はありますか?
よろしくお願いします。
504 :
:03/01/24 21:14 ID:???
すいません。教えて下さい。 MySQLは3.23.52、PHPは4.2.3PHPです。 はっきり言って初心者なんですが、実用化を目指して勉強がてらデータベースを作ろうとしてスクリプト書いてました。 メモ帳使っての手書きスクリプトですが、アップロードしてみたらソコソコいけそうな感じでした。 ですが、あげたスクリプトを色々いじっているうちに変になってしまい収拾がつかなくなってしまったので全てのテーブル名を確認して それらを全て削除したいのですが、やり方が分かりません。 色んなホームページを回ってみると出ているのですが、その殆どが個人のPC上で行う方法が多いので、はたしてそのスクリプトが正しいのか分かりません。 実際実験してみてもうまくいかないので、多分ちょっとばっかり違うのでしょう。 TELNET接続も経験がないのと第一に使えないので、そのやり方も採れません。 テーブルを全て見るためのスクリプトと削除のためのスクリプトを教えてもらえないでしょうか? ちなみに私が色々見て回ってこうかなと思って書いたものは… <? $hostname="localhost"; $port="3306"; $database="abcdefg"; $username="abcdefg"; $password="hogehoge"; $conn = mysql_connect($hostname,$database,$password); mysql($database,"SHOW TABLE"); ?> …で最後の行を色々見たものをコピペって試しています。
>>503 # ブラウザ画面に送信結果を書き出す
って行があるだろ。その下あたりを修正すりゃいい。つかPerl勉強してこい。
>>504 SHOW TABLESと DROP TABLEを繰り返しするのじゃダメ?
うまくいかないって言われても…
506 :
504 :03/01/24 22:05 ID:+KMlj8qB
繰り返しても何でも構わないんですが 上に書いたので繋がらないので分からないんですよ。 mysql($database,"CREATE TABLE $table( no int not null AUTO_INCREMENT, hoge varchar(100),PRIMARY KEY(no))"); でちゃんとテーブル作れるんですがね。
>>498 $mail = "$mailhead $mailbody"
から"$mailheadを抜く。
>>495 >$mailhead .= "Cc: $FORM{'EMAIL'}\n";
最低限、この行は抜いてください。
>504 何度も繰り返しになるが、テストはローカルでやれ。 アップしてテストをするな。
>509 今となっては同感です。 だからこそ、サーバー上のを見つけて削除したいんです。
>510 だから、消し方もローカルでテストしてやりなさいって。 まずはローカルで同じ様なデータ作って消すやり方探せばいいでしょ。 ローカルなら、他人への迷惑をあまり考えずに色々と手探りで試せるんだから。 それはやってるのか?
( ゚д゚)・・・・
諸々の事情でPCでそれを行う事ができません。 サーバー上でしかできないので、サーバーにアップしてやるしかないのです。
勝手な言い草だな(藁 一生、悩んでなさいってこった。以後放置願います>all
517 :
:03/01/25 00:54 ID:???
>516 確かに!(^o^)
>>504 PHPはようしらんが、、
http://search.net-newbie.com/php/ref.mysql.html ここみたか?
で〜
>$hostname="localhost"; $port="3306"; $database="abcdefg";
>$username="abcdefg"; $password="hogehoge";
>$conn = mysql_connect($hostname,$database,$password);
↓
$conn = mysql_connect($hostname,$username,$password);
mysql_select_db($database)
>mysql($database,"SHOW TABLE");
↓
$result = mysql_query("SHOW TABLES");
while($row=mysql_fetch_row($result)) {
mysql_query("DROP TABLE $row[0]");
}
でダメかな?
ていうかPHPスレで聞け!perlなら
use DBI;
$dsn="DBI:mysqlPP:abcdefg:localhost";
$dbh=DBI->connect($dsn,'abcdefg','hoge');
$sth=$dbh->prepare('SHOW TABLES');
$sth->execute;
while(@row=$sth->fetchrow_array) {
$dbh->do("DROP TABLE $row[0]");
}
かな?
519 :
474 :03/01/25 01:48 ID:YsIz1kts
皆さん色々勉強させてもらい助かりました。
>>508 助言を見まして検索したところ
&jcode'convert(*subject, "jis");
$mailhead = "To: $mailto\n";
# if ($FORM{'EMAIL'} ne "(unknown)") {
# $mailhead .= "Cc: $FORM{'EMAIL'}\n";
# }
こうすれば問題ないですか?
なんとなくまずいのはわかるのですが
良ければ詳しく教えていただけますか?
>>519 どこにメールが行くかを考える。
存在しないメールアドレスの場合も調べてね。
Webデータの取得にLWP::Simpleのget()を使いたいのですけど、 このモジュールはcgiを許可しているフリーのhosting service には入れてないことの方が多いのでしょうか? あるいは有料の hosting serviceであれば入ってるでしょうか?
>>521 何が楽しうてそんなもん入れんといかんのだ。
>>523 LWPって通信用でしょ?
入れても使えないところが多いと思う。
個人で入れても使えないようにってどうやってるのかな。 ダミーのモジュールを入れておいて優先順位?
527 :
初心者です。 :03/01/25 18:44 ID:WHb7ynpf
CGI.pmを使用してて perlに -w でCGIを実行すると $data = param("form_name"); でフォームからデータを受け取って このデータを下記のように条件式にかけると if ( $data eq "hoge" ) { } ってやると Use of uninitialized value in string eq at ./test.cgi line 8 ってWARNINGでるんですけど このWARNINGださないようにするためにはみなさんどうしてます?
>>527 #! /usr/local/bin/perl
そもそも自分で書くので関係ないという意見もある。
529 :
nobodyさん :03/01/25 19:05 ID:J+PAIJA/
>>528 違う。比較演算子は未定義値に使ってはいけない。
file?form_name=
で呼ばれたら、$dataは'' (空文字列?)だけど、
file?hoge=fuga
で呼ばれたら、$dataはundefになる。
つまり、こう書いておけばいい。
$data = '' unless defined $data;
definedが分かったら、existも知るといいかも。。 おまけ: undef, '', 0 はifに入れてみるとはみんなFALSEになるんだけど、 違うものだと思え。 よくある間違いで、 if (! $name) { error('名前を入れてちょ'); } これは、$nameを0にできない。こう書くべきだね。 if ($name eq '') { ... }
変な文字が・・修正 入れてみると、みんなFALSEになる
$data = param("form_name") || ''; 普通こうします。。
536 :
nobodyさん :03/01/25 20:30 ID:TLIt72nG
サブルーチン内で、 return(next); ってできますか?
質問するとしたら、なんで〜な動作をするのですか?困っているのですが。 みたいな感じになるはずだ。
539 :
nobodyさん :03/01/25 21:05 ID:TLIt72nG
できました。
540 :
521 :03/01/26 04:49 ID:???
例えばgoogleにアクセスして、検索結果を取得して処理するみたいな ことをしたいのですけど、LWP::Simpleモジュールを使わなくても 可能でしょうか?
>>540 そもそも外部と通信できなければ無理だってば。
えっと、私はCGIでゲームを作っているんですが・・・ ログインができないんです。 if ($USER_DATA[0] eq $PW) { ログイン完了 } else { パスワードちがう } とこのようにしているんですが、パスワードが合っていても違うという画面が出てしまいます。 出力して調べてみましたが もちろん、$USER_DATA[0]と$PWの値は一緒でした(調べたときは両方に'a'という文字列をいれた)。 ・・・どうすれば、きちんとした分岐結果が出るでしょうか? ifの使い方が間違っているんでしょうか
543 :
:03/01/26 10:42 ID:???
$USER_DATA[0] eq "$PW" $PWを""で囲むとか?
>>542 if文の使い方は合ってるけど……本当に中身は 'a' だけ?
空白とか改行文字が付いてるってことはない?
>>542 大文字小文字。どちらかに改行コードが残っていないか。など確認。
546 :
nobodyさん :03/01/26 11:44 ID:P6Egn5Az
とあるチャットで外部フォームでの発言が流行っているのですが、 文字に改装を加えて投稿するにはどうすれば良いのでしょうか。 タグは使用不可で、スクリプトはCOMCHATです。 もし板違いだったらすいません。
>>546 スクリプト側で対処しているなら無理でしょう。
548 :
nobodyさん :03/01/26 12:18 ID:P6Egn5Az
>>547 他の常連さんが成功してるみたいなので。。
550 :
nobodyさん :03/01/26 12:30 ID:P6Egn5Az
551 :
nobodyさん :03/01/26 12:47 ID:zx28i3UH
552 :
nobodyさん :03/01/26 12:58 ID:10NDG8/s
>>543 なんでもかんでもダブルクオートで囲むのはよろしくない。
それに、今はそれは全然関係ない。
>>542 自分が問題だと思っている部分だけじゃなくて、全体を出してみろ。
cronって何?どうやって設定するんですか?
>>553 時間を決めて実行するための仕組み。
専用レンタルサーバとかじゃないと使えないから気にしなくていい。
スレ的には、「ある時間にCGIを実行したいんだけど」な気がするから、
「CGIが読み込まれたときに時間をチェックして実行するかどうか決めろ」
555 :
nobodyさん :03/01/26 17:56 ID:lX4NK7pu
ジオシティーズのPerlのパスってなんですかぁ??
556 :
nobodyさん :03/01/26 18:44 ID:bvYo1DgE
>>554 仕組みというかただのデーモン(プログラム)。
$aaaと同じ内容の$bbbを作るにはどうすればよいのですか?
560 :
nobodyさん :03/01/26 23:30 ID:2o0R3o6+
消費税の計算なのですが、 小数点以下切捨てということで、 $tax = int($5*$total/100); という感じでやっているのですが、 小数点以下四捨五入で・・・とするにはどうしたらいいのでしょうか? 初歩的な質問ですいません・・・。
>>560 $tax = int(($total * 0.05) + 0.5);
四捨五入は、0.5を足して小数点以下を切り落とす。
563 :
560 :03/01/26 23:47 ID:???
>>561-562 ありがとうございます!!!
$tax = int(($total * 0.05) + 0.5);
↑ちなみにこの2重括弧はやっぱり付けた方がいいんですか?
$tax = int($total * 0.05 + 0.5);
だけだとだめですか?
>>563 数学と同じで*は+より先に評価されるのでいらないだろうね。
565 :
562 :03/01/26 23:52 ID:???
>>563 あー、括弧はなくてもいいです。なんかクセでつけちゃった。
566 :
560 :03/01/26 23:56 ID:???
ありがとうございます。 0.5足して切り捨て、いわれれば納得!!! つーか、最初の書き方変でしたね。 $tax = int($5*$total/100); $5ってなんだ・・・(w どうもありがとうございました。
>>566 マッチ演算子にて5番目にマッチした部分。
perlの掲示板で、書き込み内容の、 >がついてる文章を<BLOCKQUOTE>で括りたいんですが、 $message =~ s/a(.*)\n/<blockquote>$1<\/blockquote>/g; とすると、 aあいうえお aかきくけこ さしすせそ が <BLOCKQUOTE>あいうえお</BLOCKQUOTE> <BLOCKQUOTE>かきくけこ</BLOCKQUOTE> さしすせそ になってしまいます。 <BLOCKQUOTE>あいうえお<BR> かきくけこ</BLOCKQUOTE> さしすせそ にする方法と、aじゃなくて、>で出来る方法(>を使うとなぜかエラーが出ます) を教えてください。
569 :
568 :03/01/27 05:27 ID:???
>>568 あ、この方法の欠点見付けました。
>で始まる行でも、改行してなかったら引用と認識しませんね。
>で始まる行の後に、文章を書かない事はないと思いますが、万が一のために、\nがなくてもOKなようにしたいんですが。
570 :
568 :03/01/27 06:31 ID:???
>の個数だけ<BLOCKQUOTE><P>を頭に追加、行末の\nを<BR>に変換、 >の個数が一個減るたびにその直前に</P></BLOCKQUOTE>をつける、でいいんでしょうかね。
571 :
nobodyさん :03/01/27 07:42 ID:x/t6q6bL
572 :
nobodyさん :03/01/27 08:21 ID:Npl77MmW
573 :
568 :03/01/27 08:26 ID:???
>>571 原理は分かりましたが、書き方が分からないです。
575 :
568 :03/01/27 08:31 ID:???
576 :
bloom :03/01/27 08:53 ID:2qTkpcb7
すいません、 モジュールは自分で鯖にインストールしないといけないのでしょうか? 例えばLWPなどは一般的にどのような手順を踏めば使えるのでしょうか。
>>577 前も来てなかった?
一般的にはモジュール配布サイトの指示に従う。だけれど。
579 :
nobodyさん :03/01/27 16:11 ID:x/t6q6bL
580 :
577 :03/01/27 16:21 ID:???
>>578-579 ありがとうございます。
>前も来てなかった?
もし過去ログにあったなら見逃してました、すみません。
試してみて、また分からなくなったら来ます。
その時もよろしくお願いします。
>580 LWPのインストールはPerlと関係ないのでもう来ないでください。
12chというスクリプトを使ってるんですけどmegabbsにある等幅チェックなるものを移植しようとしてます。
どなたか改造するポイントを教えてください。
因みに使っているバージョンは
ttp://mitinoku.jp/script/12ch_2.02.lzh これです。
bbs.cgiというファイルを改造すればいいみたいです。
動作は、等幅チェックボタンをONにして書き込むと
<tt>「書き込み内容」</tt>
と、こんな風に<tt>タグでカキコの内容をはさむようにしたいです。
では、宜しくお願いいたしますです・・・。
583 :
582 :03/01/27 17:04 ID:???
megabbsでは等幅チェックの処理をこんな風にやってるみたいです ↓書き込みフォームの等幅チェック部分 等幅<input type=checkbox name=touhaba value=on> ↓$com(コメント)を<tt>ではさむ処理。 if ($email eq "haba" || $email eq "tohaba" ||$FORM{touhaba} eq "on"){$com="<tt>$com</tt>";$tt=1;}
585 :
582 :03/01/27 17:09 ID:???
>>584 うっ、・・すれ違いすいません・・・。そちらの方で聞いてきます。
すいませんでした。
海外製などのCGIを使うと、「ポ」など一部の文字で不具合が発生するのですが何故でしょうか。 どなたか分かる方いらっしゃいましたら教えてください。
587 :
nobodyさん :03/01/27 18:42 ID:KZuCQWmj
「こういうのがやりたい」と「どうやってもこれができない」にスレッド分割しない?
>>586 2バイト文字の処理を行っていないから?
とにかく
>>1 から始めよ。
>>587 レスの半分近くが誘導になる悪寒ガクガクブルブル
$sub =~ s/^Re:\[[0-9]+\]\s//g; の[0-9]+、ようするにその部分に入る数字を $renoって変数に格納するにはどうしたら?
590 :
nobodyさん :03/01/27 21:49 ID:o8/ytwxU
($reno) = $sub =~ /^Re:\[([0-9]+)\]\s/;
数字を3桁ずつコンマ区切りにするスクリプトを作ってみた。 某有名所のスクリプトと比べると30%ほど速いみたいだけど… 評価してもらえるかな…? 改善点とか、悪いところとか…。 初期値は $old です…。 ドキドキ $i = 0; $new = ""; foreach $n (reverse(split //, $old)){ $n .= "," unless ($i % 3); $new = $n . $txt; $i ++; } $new =~ s/,$//;
>>592 さっきもっとシンプルなの上がってたじゃん。
>>590 できました。
ありがとうございました。
>>593 どこ?
「速さ」より「シンプルさ」を重視すべきかな?
Perlメモに載ってる
597 :
腐れ厨房(゚腐゚) :03/01/27 22:58 ID:9+vb6fjV
ダウンロド&あらしスクリプトをperlで書いてんですけどLWPがうまく使えナインでcurlインストルして外部プログラムでポストするよにしタンです。 んで本題なんですけどhtmlファイルの中にポストボタンがあてcurlでポストすると302 foundのhtmlが出力されんです。そん中に書いてあるURLを今度はgetするとちゃんと希望したhtmlが入手できんですけどこれどゆ仕組みですか? 302foundのリンク先をブラウザが読んで飛んでんでしょか?それともヘダにそゆ内緒の跳び先が書いてあんでしょか?ヘダ見たけどごく普通だたと思うんですけど。
598 :
f :03/01/27 23:00 ID:???
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
24時間受付 090−8505−3086
URL
http://www.h5.dion.ne.jp/~grobal/ メール
[email protected] グローバル探偵事務局
>>592 $old = 1225678901;
while($old =~ s/(\d{1,3}?)$//){ unshift(@_,$&); };
print join(',',@_);
ちゅうのはカコ悪いか(w
>>597 Apacheの仕組みを覚えれ。
>>597 Apacheだと、エラー時に好きなページを出力できる。
cgiを起動する事もできたりする。
603 :
g :03/01/28 04:31 ID:QDc4rCif
すいません、今本を見ながら一生懸命猿まねしてるんですが、、、 スラッシュの反対向きのやつってどうやって入力するのですか? それらしきキーを押してるのに「\」が出てきます。 誰か教えてください。
604 :
g :03/01/28 04:54 ID:QDc4rCif
>>603 フォントを変えるとできました。
お騒がせしました。
すみません、ご存知の方いらっしゃれば教えて下さい。 あまり詳しくは言えないので非常に申し訳ないのですが、 ある2つのcgiをWin98(Celeron500)+Apache2+ActivePerl5.8で動かしていて全く問題がなかったのですが、 Win2000(Celeron500)で同じサーバ構成を作り(たぶん)稼動させた所、 1つは非常に快適に動作し、1つは動かないに等しい程おそくなってしまいました。 CGIを自分でかけないので分からない、というのがすでに問題なのですが、 こう言ったことは起こりうると推測出来るでしょうか? サーバの構築ミスとかも有るかもしれません、、、。 ご教授頂ければ幸いです、、、、。
606 :
592 :03/01/28 06:47 ID:???
確かに似たようなのあるね すまそ
607 :
腐れ厨房(゚腐゚) :03/01/28 07:15 ID:vWtuYxkU
>>607 帰れ。せめてhttpのRFCぐらい目を通してこい。
あと、日本語も勉強してこような。
>>605 起こりうる可能性はいくらでもありますね
ソフトウェア的な設定ミスから
ハードウェアやネットワークの障害などなど
ひとまず順を追って用意した環境が間違いないか確認しましょう
>>607 まずは日本語を(ry
610 :
605 :03/01/28 10:05 ID:???
>>609 さん
レスありがとうございます。
そうですね、おちついて順をおってもう一度やってみます。
CGIのプログラムを外注に出しているので、
「おい動かなかったぞ!」と文句つけてみたものの
自分の設定ミスでしたという訳にもいかず(w
ただもともと動いていたCGIなので、どちらかといえば自分の設定ミスの方が
ありえるかな?と、その可能性をあたってみたかったという所です。
いやまったくお恥ずかしい話なんですが。
ここperl
612 :
609 :03/01/28 12:15 ID:???
>>610 外注先がコンサルしてくれないって痛いですね
大変だと思いますがガンガってくださいまし
スレ違いネタになってきたのでこの辺で、、
ここDQN
614 :
腐れ厨房(゚腐゚) :03/01/28 16:53 ID:vWtuYxkU
>>608 んな難解なヘンテコ文章読むの強要する低脳さんです。乞食が「このくらいの寒さひもじさなんだお前ら根性なし。」と騒いでるみたいです。
ところですべての文字列にマチさしたいんですけど
([.]|[^.])*?
てヤてんですけどカコとパイプだらけでカコ悪いです。もちょとスマトな方法ないですか?
全能な正規表現
(??{ code })
(?{ code })
これ試してみましたけどなんかダメでしたです。Perl5.8です。
616 :
nobodyさん :03/01/28 17:08 ID:oYLjlQQn
全ての文字列にマッチってなんじゃろ? .* ということではなくて? あとLWP::UserAgentはredirectの解決もしてくれるから便利だよ。 curlはよくしらないけど。
617 :
nobodyさん :03/01/28 17:09 ID:oYLjlQQn
かぶった。
618 :
腐れ厨房(゚腐゚) :03/01/28 17:20 ID:vWtuYxkU
.*だと空白とか\nとか\rにマチしナインで都合悪いんです。 あとLWPは何度やてもうまく逝かなかたんで諦めましたです。curlはwgetライクで使い安いです。
腐れ厨房←他人のコテハン使うの止めろ。 荒らし←どうせ2chだろ。 氏ね
man perlre読め。 /.*/s
621 :
腐れ厨房(゚腐゚) :03/01/28 18:42 ID:vWtuYxkU
腐れ厨房さんだ!本物?
623 :
nobodyさん :03/01/28 19:46 ID:wCME9ZCu
open(FILEA,"/var/tmp/a"); open(FILEB,"/var/tmp/b"); while ($linea=<FILEA>) { while ($lineb=<FILEB>){ if ( $linea eq $lineb ){ 処理・・・ } } 見たいな事ってできないんでしょうか? 上記のコードだと FILEAのループが 1行分で終了してしまうのですが・・
>>623 配列に代入してforeachを使ってみてはどうだろうか
626 :
nobodyさん :03/01/28 19:57 ID:wCME9ZCu
>>624-625 ほぅほぅ。
とにかく623のコードじゃダメなわけね。
なんでダメなんだろ?理由がわからない。
>626 ファイルハンドルからのデータ取得は、一度最後まで行ったらseekしないと戻らないから。
>>627 なるほど!!
じゃぁ1個目のWhile文のなかでFILEBをOPENするか、Seekで先頭にもどすかすれば
だいじょうぶかな?
こんど試してみます。今、環境がないんで。
629 :
nobodyさん :03/01/28 20:07 ID:VjdgexrL
>>623 一個目のwhile抜けた後でseek FILEB,0,0でもすれば?
630 :
腐れ厨房(゚腐゚) :03/01/28 20:53 ID:EPPQeVDF
>1個目のWhile文のなかでFILEBをOPENするか
僕の環境だとそれで逝けましたです。なんかネストしたらシクしないて不良品てカンジイです。
>>622 僕です。
板違いかもしんないけからsageで・・・ フォームのサブミットボタンに表示させる文字って VALUE=" "に書くやんかぁ? でボタンにダブルクォート自体を表示させたい場合ってどうするん? どうするん? どうなん?
>>632 ほぉー!
なるほど。
じゃぁじゃぁ シングルクォートとダブルクォート両方を表示したい時は??
>>634 ほぉー!
なるほど。
いやぁ実はPerlでCGI作ってて、フォームで入力してもらった文字列を
表示させる部分があるんですが、そのまんま表示してるんで < とか ”とか
入力されたら困ってたんですよね。
ほー!
こういうのを自動でチェック、変換してくれるよかモジュール知らんですか?
>636 それHTMLだけだろ 637の方法以外に \" \'
639 :
nobodyさん :03/01/28 23:26 ID:0+yLIxs1
これでなんで動かないんですか? #!/usr/bin/perl print"Content-type:text/html\n\n"; print<<EOF; <html> <body> あああ </body> </html> EOF
641 :
nobodyさん :03/01/28 23:38 ID:6cWKDFOV
>>640 #!/usr/bin/perl
→
#!/usr/local/bin/perl
にしてみた?
>>640 最後の行の「EOF」の後に
半角スペースが入っている。
>>640 具体的にどう動かないのかちゃんと書いてくれ。
ちなみにうちの環境では期待する動作をした。
644 :
640 :03/01/28 23:49 ID:???
>>641 サーバーは#!/usr/bin/perlなんです。
念のため#!/usr/local/bin/perl にしましたがダメでした。
>>642 >>640 の書きこみはスペース入ってますが実際はスペースはありません。
一応書きなおしましたがダメでした。
#!/usr/bin/perl
print"Content-type:text/html\n\n";
print"あああ";
だと動きますが、
#!/usr/bin/perl
print"Content-type:text/html\n\n";
print<<EOF;
あああ
EOF
だと動きません。
EOF の次の行に ; とか。 改行コードがおかしいとか。
646 :
640 :03/01/28 23:51 ID:???
>>643 実行するとInternal Server Errorとでます。
647 :
640 :03/01/28 23:53 ID:???
>>645 最後の行に";"を入れたら動きました!!
ありがとうございました!!!!
648 :
640 :03/01/28 23:54 ID:???
最後に";"を入れないと動かないサーバーもあるんですか。 知りませんでした。
>>647 それはPerlの構文的にヘンだなぁ。(俺が知らないだけかもしれんが)
ヒアドキュメントの終端文字列は << "EOF"; みたいにダブルクオートで括ったほうがいいよ。
650 :
640 :03/01/29 00:13 ID:???
>>649 おぉ!!
<<"EOF";にしたら
最後の行に";"を入れなくても動きました!
基本的な事ですがかなり勉強になりました。
っていうか今まで全然プログラムが動かなかったのもこのせいか・・・
>>646 Internal Server Error ってのはCGIからの出力が来ないときにブラウザが出す
エラーだから、これを書かれても根本的な原因は一切分からないんだよ。
コマンドラインで実行させた結果を書いてくれるとすぐ分かる。
たとえばこんなの。(うちでは最後の行に ; をつけたらこう出た)
Can't find string terminator "EOF;" anywhere before EOF at test.cgi line 3.
652 :
651 :03/01/29 00:17 ID:???
あ、なんだ、EOFの次の行か… まあいいか。
EOFの最終行に改行が足りていなかった予感。
655 :
640 :03/01/29 00:44 ID:???
日曜スクリプティングで、素人ながらも何とか基本的なコマンドを 使って掲示板くらいは1から自分で作れるレベルになったのですが、 まだ色々無駄があったりすると思うのです。 それで、コーディングが奇麗な、参考になる(初心者にも比較的読み やすい)スクリプトは、どこかに公開されてないでしょうか?
KENT-WEB
658 :
nobodyさん :03/01/29 03:04 ID:HsIeKX/p
結構くだらない質問です・・・ 下記の様にそれぞれの変数に、同じ文字列を連結して $a.='<table border="0">'; $b.='<table border="0">'; 途中で処理が加わり$a,$bに違う値が連結され・・・ 最後に下記の様に連結して締めようかと思います。 $a.='</table>'; $b.='</table>'; 質問というのは同じ文字列を違う変数連結する場合、 1行にできないのかという事です。 ($b,$a).='<table border="0">'; #イメージ・・・$bにだけ連結して駄目でしたが・・・
659 :
nobodyさん :03/01/29 03:30 ID:KC7FDxMH
>>658 期待してる回答とは違うとは思うが
map {$_ .= '<table>'} ($stringA,$stringB);
とか。
あと、$a,$bは普段から使うの避けといた方がいいかもね。
sortで使うから。
>KENTの悪いところ >1.スクリプトが冗長だから省略するのに慣れてる人には読みにくい >2.メモリの利用効率が悪く、スクリプトも速くないからサーバに負荷をかける >3.CGIは起動コストがかかるのでHTMLファイルを生成した方がよい メモリの利用効率というのは、スクリプト書く時に どういうことに気をつければ良いのでしょう? 掲示板なんかだと、出力は極力HTMLファイルとして細かに保存していった方が良いのでしょうか?
661 :
nobodyさん :03/01/29 09:41 ID:zyXgtkRr
662 :
nobodyさん :03/01/29 11:16 ID:tPWI6izk
>KENTの悪いところ >1.スクリプトが冗長だから省略するのに慣れてる人には読みにくい >2.メモリの利用効率が悪く、スクリプトも速くないからサーバに負荷をかける >3.CGIは起動コストがかかるのでHTMLファイルを生成した方がよい ↑ほんと難癖だなw 1.ある程度一般的な書き方だと思うし、もともとperlは制約が少ないんだから仕方ないべ。単に自分の書き方と違うから気に食わないだけだろw 2.ソースは?w 3.馬鹿の一つ覚えだな。
664 :
nobodyさん :03/01/29 13:01 ID:22PcLDQj
>>659 なるほど、なんとなくすっきりしました。
もっと一般的な簡単な方法があるのかなと思っておりました。
$aはたまに使ってますね・・・
気をつけます。
メモリーの利用効率ねぇ・・・Perlで細かくメモリー管理ができるのかしら。
書き方どうこうよりクロスサイトスク(以下略
>>666 サーバサイド言語のスレでわざわざ語ることではないけどな。
668 :
nobodyさん :03/01/29 16:54 ID:XF7MERR2
CGIの出力でファイルを新規に作成した場合 FTPソフトなどで作成したファイルを削除・変更しようとしても 権限がなくて実行ができなくなってしまいます。 ファイルを新規作成するときに何か特別な処理が必要なのでしょうか もちろん調べまくったのですが原因がよくわからないのです。 よろしければ教えていただけないでしょうか?
669 :
nobodyさん :03/01/29 16:59 ID:19DeFoXE
>>668 ファイルの所有者がnobodyとかapacheとかwwwとか、
とにかく自分のものではない場合CGIで作ったファイルはCGIで削除しないといけません。
670 :
nobodyさん :03/01/29 17:05 ID:v+6haFSn
flockがうまくいきません。教えてください。 if (open(MBOX, ">>".$votename)) { print "ファイルを開きました。<br>\n"; } else { print "ファイルを開けません。<br>\n"; die "Can't open mailbox: $!"; } if (flock(MBOX,$LOCK_EX)) { print "ファイルをロックしました。<br>\n"; } else { print "ファイルをロックできません。<br>\n"; } この結果、 ファイルを開きました。 ファイルをロックできません。 になりました。
>>670 初回時ロックを解除しないで終了しました?
672 :
nobodyさん :03/01/29 17:14 ID:19DeFoXE
>>670 $LOCK_EX = 2;
が無い可能性大。
または、flock(MBOX,2)でどうよ
673 :
670 :03/01/29 17:17 ID:???
>>671 レスありがとうございます。
closeしてるから大丈夫だと思ってます。
ISPはinfoseekです。
674 :
670 :03/01/29 17:20 ID:???
よく見たらcloseしてませんですた スレ汚しすまそ
675 :
670 :03/01/29 17:22 ID:???
676 :
nobodyさん :03/01/29 17:27 ID:XF7MERR2
お答えありがとうございます 全削除のCGIでもいそいそと作成します
正しくは、 use Fcntl qw(:DEFAULT :flock); flock(FILE,LOCK_EX); な。 LOCK_EXはおおえす依存だから、シソボルはインポートするのが良い。
678 :
nobodyさん :03/01/29 18:16 ID:zyXgtkRr
外部から受け取った変数をファイル読み込みの変数に使うにはどうすればいいのですか? $bufferという変数に"./hoge.dat"みたいな文字列を渡したのですが、 open(IN, "$buffer"); とやっても上手く開いてくれません
外部って何から入力するの? 環境変数なら %ENV、 コマンドライン引数なら @ARGV、 標準入力なら<STDIN> お好きなのをどうぞ。
>>553 plala規制で亀レススマソ
シンプルcrond perl板、以下のUUEコードを開いてcrond.plが出来てるから
begin 666 crond.zip
M4$L#!!0````(`+.*.BZ8A!N!J`,``,8'```(````8W)O;F0N<&R555MOTT@4
M?HY_Q2$QQ%8=7](4[28UE(IRD1!")>*ES0K7GC2S./8P,Z98D/WM>\Y,'!)1
MJ<)JW9ES^<YW;N[@4=0H&=WP*A),EDZC&,SYFDVG[^H\*V'F",DK#:>G\[?S
M<[P.X`/:02[KJH#S%MZ$NO[":AC'\7&41,E3<`8KK<4TBN[N[D)V*^M&J#"O
MPW]%M.0E4]%%=3LZ-^'F7*CH1:-K<S"8$480B>$`+]D2\A7+O\!)VK),!I-T
M75?!<5ID;3!.5W4C@R1=\RJ(4\5R\AS#1YU)#1K]%
[email protected] \8GCR8%@J
M&)49$)5K5[09OM8UOHIL"%P9>8O/>ET4Z*4TKVY]!,+'`!EB2F=K`=\RJ:9@
M==UC("&UMH:SP=\*D+U>!2989X.I'""0=M5LE29#`N"I]>=5HYDBD6)6A'D3
MA2LQ^8T?EH])ALW#O$=_G4SBF!(<)=N0X@3*^M:T1+"<+UM3GV?/#$Z(*I.V
M>+K`FDBE"10+JYB&5V\O/\XA=&@D'-7<P`>,^AH5/YS>N@6WP+ZEH%9\J7%B
M2.2YR#-PJ54N)A6XU$&7FNFVF?2MD2LTNE'G2IH]S[SI2GI2'J4$C9<'X%+8
MN7KHY\](>I0F?\?QC*SP2(@H))IFP)=>_W$\*?H[/F1WJ!V3%J5&BP'OT:+4
M:)'3/5J46F1^+S*WR-30W[4H):UDNI'5`^ECS3?.6:ETNBO#S''-=DG=+M/X
MX)8$]K+$B4H"N^W]5Z;C-`C751_X$AOXXO+UIZN31?I?](_I?X1\[E8X/5[B
M4^-5R9C`,[(\$X>Q>P3@L6_84Q=I75FL>+'PX1%.NI&+`[G_\Z>WH^4;_-XO
MFIA`;Q_ST!?2#M.(DGTTRG@+USNL2*\W&-A/AY!U3GK"90$M7T`K&=#6TK4.
M:,=QR+93[^T%.\9@,^O\P(1VSK&UW];]`BL^M5#CQ75%MA%Y16;@"&E*F%-"
MQ\YT7^<^;?W(;/WH4R:G1+"C:D@;^B81Q8P?Y7]#@V;(#X&V^`>XLJ05_#P,
M.P[;PV01#N'S#+KY>^[/-D-_!H335/@%43@A9]O"]ER6UP5+GV`$$VF;':&'
M_2[\'Y>HJ]%C2P)L%/B3:A&*&6;KRK[",!YVK/<'(K&VNY!PR;1LX3W[KO$+
MFZM?'\-P![RA]\:4A)7X;]2B%IQ!/Z]E582BA`LI:PG(>+S79>M/[OB+/TLT
M\5R.4^GR4]HE_'MTY%-_S/;P!?;(#CT>9QMG\S]02P$"%``4````"`"SBCHN
MF(0;@:@#``#&!P``"``````````!`"``MH$`````8W)O;F0N<&Q02P4&````
/``$``0`V````S@,`````
`
end
そいで毎朝8時に自分の携帯におはようメール送る例が以下
./crond.pl 2 8 'perl mailsnd.pl SMTPServer from-mailaddr "$pmo月$pda日おはよう" "8時です!"'
と打ってmailsnd.txtに自分の携帯メルアド入れとくこと
>>679 それだけじゃ分からんよ……
「外部」ってどこ?
「上手く開かない」って、どう上手く開かないの?
エラーが出てるならその内容も書いて欲スィ。
(Internal Server Error は書いても無駄なのでよろしこ)
683 :
nobodyさん :03/01/29 23:34 ID:Fxyvk81T
すまんです、 文字コードの変換のプログラムをいじくってたら &jcode'sjis2jis(*value); ↑こんなのあったんですが、これってどういう意味ですか? 必要な情報が少ないかもしれませんがよろしくおねがいします。
685 :
679 :03/01/29 23:41 ID:???
すみません、外部というのはFLASHのことです。 FLASHがCGIを呼び出す時に"./hoge.dat"という文字列を渡し、 それをCGIが$bufferという変数に受け取ったのですが・・・。 下のようにしてFlashにmyDataとmyBufferという変数を返してみると、 myDataの中身は空っぽでmyBufferの中身は"./hoge.dat"という文字列でした。 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); open(IN, "$buffer"); $toFlash = <IN>; close(IN); print "Content-type: text/plain\n\n"; print "myData=$toFlash&myBuffer=$buffer"; ちなみに下のようにPerlに直接ファイル名を書けばちゃんとmyDataにファイルの一行目が表示されました。 $buffer = "./hoge.dat"
jcode.pl(だと思うが)で $value を sjis から jis に変換している。
>>685 >$toFlash = <IN>;
を
$toFlash = join('', <IN>);
にしてみる。
>>685 FLASHからのCGI呼び出しがいまいちよくわかんないけど、
GETメソッドで来てるってことはない?
そのソースだとPOSTでしか受け取れないよ。
$ENV{REQUEST_METHOD} の中身はどうなってる?
691 :
679 :03/01/30 00:08 ID:???
>>687 やってみたのですが相変わらず何も返ってきませんでした…。
>>690 POSTで送りました、$ENV{REQUEST_METHOD}の中身もPOSTになっていました。
>>685 >myDataの中身は空っぽでmyBufferの中身は"./hoge.dat"という文字列でした。
>print "myData=$toFlash&myBuffer=$buffer";
$bufferの内容はカラだったの?
$bufferの内容:myBuffer=./hoge.dat なら、 (undef, $buffer) = split(/=/, $buffer, 2); かな。 Flashの仕様が判らないんで、すまそ。 (そうだとしたら、きちんと処理した方がいいと思う。)
694 :
679 :03/01/30 01:25 ID:???
>>692 >>693 $bufferの内容:./hoge.dat
です。
すみません、実はCGIは勉強し始めてまだ数日なので基礎からなっていません。
もう少し自分でなんとかしてみます。
暫くは適当な値を送ってそれをCGIでif(あればcase)で判定し
その中に直接ファイル名を書いておきます。
(これだとファイルを加えたり名前を変えるたびにPerlを書き換えないといけないのですが・・・)
chomp;
chomp $buffer;
改行がついてるという可能性もあるかもね。
(
>>695 ,696はそれが言いたいはず)
表示して確認するときは、前後に " なんかをつけてみるといいかも。
非表示文字がついてるかもしれないから、length で長さを表示して
見た目の長さと一致するか確認するという手もある。
$tmp = "./hoge.dat" として、$bufferと比較してみては if($tmp eq $buffer){print "OK<br>";} else{print "NG<br>";}
700 :
nobodyさん :03/01/30 14:28 ID:NtdcRjvu
くだらない質問かもしれませんが、 変数名とかハッシュ名を変数で与えることって出来るんでしょうか? for($i=0;$i<=$#avs;$i++) { if ($avs[$i] =~ /^###(.+)_PROCESSING$/) { $process_id = $1; $process_id2 = "\L$process_id\E"; $avs[$i] = "${$process_id}{${$process_id2}}\n"; } } みたいな感じで、 ###DEDOT_PROCESSING っていう行を、 $DEDOT{$dedot} で置き換えたいんですが、うまくいかないです。 何か根本的に勘違いしてますでしょうか? jperl 5.005 です。
$avs[$i] = "\$${process_id}{\$$process_id2}\n";
702 :
700 :03/01/30 18:34 ID:tRX1dMh1
>>701 それだと $DEDOT{$dedot} っていう「文字列」にしかならんのでは...
私の書き方もアレでしたが、%DEDOT の $dedot の値で置き換えたいわけで....
703 :
679 :03/01/30 18:46 ID:???
解決しました。 lengthで$bufferを調べてみたところ、 "./hoge.dat"だから10でなければいけないのに16になっていました。 chompを使ってみたのですが値は変わらなかったので、substrで1文字目を削ってみると "2E/hoge.dat"という値が返ってきました。もしかしたらと思い4文字目までを削ると "2Fhoge.dat"が、11文字目までを削ると"2Edat"が返ってきました。 どうも"."は"\2E"、"/"は"\2F"としてFLASHから送られていたようです(最初の文字が\かどうかは分かりませんが…)。 結局FLASHからは"hoge"だけを送り、CGIで $buffer = "./$buffer.dat"; とすることで正常にファイルを読み込むことが出来ました。 本当にどうもありがとうございました。
704 :
nobodyさん :03/01/30 20:53 ID:XHYONXXP
CGIを使ってWebからサーバの管理をしてるんだが、 CGIで行ってる処理が重すぎて処理が終わるまでに ブラウザがタイムアウトしてしまいます。 そのためブラウザがタイムアウトしないように、 CGIで処理をしている間、ブラウザに30秒に1回データを送るとか そんな方法でブラウザがタイムアウトするのを防げないですか?
>>705 処理が重いところってsystem関数でOSのコマンドを実行してて、
この1回のsystem関数を実行してる間にブラウザがタイムアウトするんです。
で、system関数でOSコマンド動かしながら同時にブラウザにデータ送れますか?
わかんないね!
>>702 $hashname="myhash";
$keyval="key1";
%myhash=( key1=>"key1value",);
$val = "${$hashname}{$keyval}\n";
print ":$val";
で
:key1val
と表示されたがこれじゃダメなのか?
>>700 シンボリックリファレンスを使いたいっていうことだね。
まず、これを理解しろ。
$a = 'DEDOT';
${$a}{key} = 1;
print $DEDOT{key};
で、本題に戻ると、$dedotが正体不明なんだけど、
$avs[$i] =~ s/^###(.+)_PROCESSING$/${$1}{lc $1}/;
もしかしてこうしたいとか?激しく意味不明だけど
>>702 それより気になるのがその処理内容なんだが……。
1つのハッシュに1つのキーしか入れないのでは、ハッシュの意味がないと思うんだけど。
あくまで例としてなら別にいいんだが、そうじゃないなら処理内容を見直したほうがいいかもよ。
711 :
:03/01/31 04:10 ID:???
翻訳掲示板を作っています。書き込みは、例えば日本側なら英語訳、英語側なら 日本語訳も記録して、日英かかわらず全ての投稿を母国語で閲覧でき、コミュニ ケートできる、というような感じのものです。 で、掲示板スクリプト自体は簡単にできるのですが、やはり翻訳がネックとなって います。自分で翻訳ソフト用意して、高価なサーバーをレンタルしたり、自宅で 専用線でサーバー立てたりすると、かなりの金額がかかってしまうと思うのです (非商用の個人サイト運営程度には)。 できれば、オンラインの翻訳サービスを自分のスクリプト内で利用したいのですが、 個人で翻訳機能だけレンタルすると幾らくらいかかるんでしょう? 無料でウェブ 翻訳、テキスト翻訳を公開しているところもありますが、そういう用途に 使うのは断り書きを出してもやはり不味いですかね?
712 :
nobodyさん :03/01/31 06:28 ID:/ObcG1bj
>>711 全然Perlと関係ないじゃん。
AMIKAIが翻訳サービスOEMの老舗だけど相当高そうだね。
自分で翻訳ソフト買ってもサーバとして使うにはライセンス料が
えらく高くなる。
結局のところ掲示板を見てもらうときにexcite翻訳を通して見てもらう
しかないのでは?掲示板に入る時にexcite翻訳へのリンクを作るとか。
自作CGIで勝手にexcite翻訳を使って翻訳することも可能だけど、
exciteの広告が表示されない利用方法は問題があるからやめた方がいい。
713 :
nobodyさん :03/01/31 07:08 ID:6uKSmBl3
714 :
:03/01/31 07:52 ID:???
>>712 すいません。掲示板自体はperlで作っていたもので。
私の方では無論、広告やそのサイトのバナーを掲示板に表示させることは
まったく構わないのですが、向こうの方でそういう利用法を了承するかは、
やはり難かしいですかね。
翻訳は、例えばフリーのテキスト翻訳サービスを利用すると、form getを
使ってurlに投稿文を含ませたのを送って(trans.cgi?text=$body&lang=....)、
帰って来た翻訳をまたPERLで処理して出力する、という感じです。
単なる個人サイトなので、値段が年1万円を超えるようだと少し辛いです…
好きな様に利用できる本当にフリーの翻訳サイトは何処かに無いでしょうかね。
企業が無料公開しているようなのではなくて、教育機関や個人がGNUライセンスで
作ったような…
715 :
nobodyさん :03/01/31 07:58 ID:0xsv6W8Z
716 :
nobodyさん :03/01/31 08:00 ID:/ObcG1bj
717 :
712 :03/01/31 08:05 ID:???
>ユーザーは当該私的利用の範囲を超えて、例えば営利目的のために >本サービスによる翻訳結果を公表、引用、改変等により使用する >ことはできません。 勿論、「営利目的」ではないですが、個人サイトの掲示板で使用するというのは 「私的利用」の範囲を超えるのか…個人利用する分にはCDコピーはいい(?)けど、 Napsterとかで公開するのはまずい、という感じに近いのか…。
718 :
712 :03/01/31 08:29 ID:???
720 :
nobodyさん :03/01/31 10:13 ID:NKGtpjno
掲示板を作っているのですが、 &を&に変換したいんですよ。 でもそうすると、♥とわざわざ入力したときに &hearts;となってしまいハートとかを出せなくなってしまう。 どういう変換方法にすれば、 &→& >→> <→< ♥→♥(変換されない) こういういい感じになるんでしょうか? ちなみに2ちゃんはどうなってるんのかわかりますか? よろしくお願いします。
>>720 s/&\[^([a-zA-Z].;)]/&/g
>>721 s/&\[^([a-zA-Z].;)]/&amp/g
s/&\[^([a-zA-Z].;)]/&/g
724 :
720 :03/01/31 10:31 ID:???
はげしくどうもです! あまりにスマートな回答に感動しました。 私はまだまだ修行がたりないようです。 またどうしてもわからなくなったら相談させてください。
ごめん、&の後ろの¥もいらない。 2chの特殊文字変換に翻弄されまくっている私。
727 :
nobodyさん :03/01/31 11:16 ID:5ww5eJFm
728 :
720 :03/01/31 11:17 ID:???
? じゃぁつまり、 $value =~ s/&[^([a-zA-Z].;)]/&/g; でOKですか? セミコロンはエスケープしなくていいんですよね? 聞く前にとりあえず試してみます。
729 :
720 :03/01/31 12:10 ID:???
すいません・・・ 動きません。 これでは $value =~ s/&[^([a-zA-Z].;)]/&/g; エラーになります &^([a-zA-Z].;) だとエラーになりませんが変換されないし・・・ さっぱりです。
730 :
720 :03/01/31 12:12 ID:NKGtpjno
↑は一応しつもんなのでageさせていただきます
>>729 $value =~ s/&(?![\#0-9a-zA-Z]+;?)/&/g;
でどぉだ?
>>731 $value =~ s/&(?![\#0-9a-zA-Z]+;?)/&/g;
エスケープ忘れスマソ
733 :
:03/01/31 12:33 ID:???
Strictを使った時にエラーが出ない様に、 冒頭でour ($aaa,$bbb)って感じで大量に global variablesを列記してるのですけど、 これってやる意味あるのでしょうか? 書かなくてもStrict外せばscript自体は動くのですが。
734 :
720 :03/01/31 12:37 ID:???
>>732 完璧です。泣ける。
すでに私には理解できない正規表現になっちゃってますが・・・。
勉強してきます。
ついでに、こういうときって、不明な実体参照をいれても
もちろんそのままになりますよね。
これは掲示板の仕様として正しいのでしょうか?
それともちゃんとした実体参照なのかどうかのチェックをいれてあげる
べきなのでしょうか。
ちょっとスレ違い気味の質問かも。
>>733 グローバル変数を極力使わないようなコーディングを心がけるべし。
737 :
:03/01/31 13:38 ID:???
くだらない質問ですが
「data」に書きこむ際に「
http:// 〜」の文字を送ると「http//〜」のように「:」が抜けて
「data」に書きこまれるんですがなんでかわかりません。どうしてでしょう?
>>737 まぁ、データのセパレーターか何かでコロン使ってるんじゃないの?
スクリプト中で消されてるんだろ。
>>737 そもそも "data" って何だ?ファイル名か?ファイルハンドルか?
ファイルハンドルは大文字使ったほうがいいぞ。
ただし DATA ファイルハンドルは予約されてるから注意な。
とりあえずソース晒せ。
お前ら、このアホがPerlなんぞ書けるとでも思ってるのか?
742 :
nobodyさん :03/01/31 14:27 ID:Q0yPIF7u
MS-DOS上でPerlを動かしているのですが、 My Documentsのようにスペースの入ったフォルダのなかまでglobでファイル一覧を得ることはできないのでしょうか? なるべくならワークディレクトリを移動せずに相対パスで指定したいのですが。 print glob("dc\\My Documents\\*");
>>742 ファイル名をMS-DOS形式で記述してみては?
My Documents → MYDOCU~1 とか。
すいません… やってみましたが、WinMEなのでプロパティにはDOS形式のファイル名が表記されていませんでした。 あと、深いディレクトリまで自動探索していくバックアップ系ツール(のヘタレ品)なので、globで得たディレクトリ名を自動的にDOS形式のファイル名に変換するというのも漏れの技術では少々難ありです… なんでか、ロングファイル名でglobに引っかかるんですよね。
746 :
744 :03/01/31 14:56 ID:???
>>745 様
globでdirコマンドのオプションが使えるということでしょうか?
dir /? してみたところ、 /p w a o s b l v 4 の各オプションがあるようですが、旧ファイル名で表示するオプションは見当たりませんでした…。
747 :
nobodyさん :03/01/31 14:56 ID:6uKSmBl3
748 :
:03/01/31 15:02 ID:???
>>735 ああ、つまりglobal関数は極力控える方が良いコーディングになる
ということなんですかね。
>>744 globじゃなくて、readdirでディレクトリ内を取得してみたら?
これでディレクトリを移動する処理を組んだけど、スペース入りディレクトリも
ちゃんと辿っていけたよ。
750 :
744 :03/01/31 15:05 ID:???
なるほど!!readdirですか!Σ( ̄Д ̄;) さっそく試してみます。ありが沌でした!
>>734 すべて変換して実態参照を無効化する。必要なものは元に戻す。ってすればいい。
つまり、
s/</</g;
s/>/>/g;
s/&/&/g;
s/♥/♥/g;
&hearts(セミコロンを忘れたもの)は無効なものとして処理しておけばいいじゃろう。
>>751 で、すべての実体参照にその論理で対応するわけか。ブルーだな。
>>752 そのぐらい工夫してよ。。
一番簡単で安全だと思ったから書いたんだけどー、
自分では分からなかったから悔しいのかな?
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/&/&/g;
@allow = qw(hearts ... ...);
foreach my $str (@allow) {
$text =~ s/&$str;/&$str;/;
}
>>753 >@allow = qw(hearts ... ...);
これがダサいと言ってるんだが・・・。
じゃあ速くて格好いいのを書いてください。
756 :
727 :03/01/31 21:49 ID:5ww5eJFm
require 'cgi-lib.pl';
&ReadPlarse(*form);
require 'jcode.pl';
&jcode'convert(*form,'sjis');
$data = $form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n
open(ENQ, ">>$enqdata.dat")||do{print "ERR";exit;};
#flock(ENQ, 2);
print ENQ $data;
#flock(ENQ, 8);
close(ENQ);
print "Content-type:text/html\n\n";
print >> "END_OF_HTML";
<HTML>
<HEAD>
<TITEL>有難う御座いました</TITLE>
</HEAD>
<BODY>
アンケートは送信されました!<BR>
またのお越しをお待ちしています
</BODY>
</HTML>
END_OF_HTML
これを動かしたらシンタックスえらーがでたけどなんで?
公開されているプログラムなのに。
http://www.salut.ne.jp/bf/wmh/seminar/c010/index.php3
757 :
nobodyさん :03/01/31 22:14 ID:1gqujj9y
>>756 またおまえか。馬鹿かお前は。
エラーが出たんならどんなエラーがさらさんとわからんだろうが。
本気で答えて欲しいのならそれなりの情報を出せこの厨房が。
>>734 確か、&はいっさいCGI側で変換しない方がいいよ、
っていう文章を読んだことがある気がしたんだけどソース失念。
もし<r;のように封じたい文字参照があれば
狙い打ちでエスケープすれば済むし。
>>753 my %refchr = qw(hearts & clubs & diams & spades &);
$text =~ s/&(\w+?);/($refchr{$1} or '&')."$1;"/ge;
もちっとマシな書き方があるかも。
>>756 エラーをコピペ。
500 Inter(略は無意味だからね。
760 :
751 :03/01/31 22:37 ID:???
自分が想定しないゲロい実体参照を入れられる事が、危険だと考えるなら、
有効だと思うんだけどなぁー
>>759 &aaaaaみたいなものの&がそのまま残る可能性があるから、ブラウザに拡大解釈
される可能性が残るので良くない。
これに対処しようとすると、その方法だと異常にやることが増えて、
>>751 に書いた(変だけど)
単純な置換の方が圧倒的に速くなる、はず。
761 :
759 :03/01/31 22:49 ID:???
ほんとだ。 あちらを立てればこちらが立たず。
# 安全 s/&(?!(?:amp|#(?:[Xx][0-9A-Fa-f]+|[0-9]+));)/&/g; s/"/"/g; s/</</g; s/>/>/g; # 便利 s/&(?!#(?:[Xx][0-9A-Fa-f]+|[0-9]+);)/&/g; s/&(?:amp;)([0-9A-Za-z]+;)/&$1/g; s/"/"/g; s/</</g; s/>/>/g;
あー。 # 安全 s/&(?!(?:amp|#(?:[Xx][0-9A-Fa-f]+|[0-9]+));)/&amp;/g; s/"/&quot;/g; s/</&lt;/g; s/>/&gt;/g; # 便利 s/&(?!#(?:[Xx][0-9A-Fa-f]+|[0-9]+);)/&amp;/g; s/&(?:amp;)([0-9A-Za-z]+;)/&$1/g; s/"/&quot;/g; s/</&lt;/g; s/>/&gt;/g;
764 :
nobodyさん :03/02/01 01:11 ID:PH6PPkmG
↑にも出てるけど・・エラーメッセージってどうやって出すんですか? 俺今までInternalServerErrorがでると1行1行チェックしてた・・・・ 誰かアホな俺に教えてくれ。。
>>756 スクリプトの記述ミス発見したところだけ
これ以上はしらん。後は自分で探してくれ。
誤:&ReadPlarse(*form);
正:&ReadParse(*form);
誤:print >> "END_OF_HTML";
正:print <<"END_OF_HTML";
うちの鯖は 500 鰓の時、エラー内容の出力をさせています。 でも、ディレクトリ構造がばれるのでこあいです(w ♪なんだか & 処理が加熱しているねぇ、、、 そこまで何にも考えていなかった、、、スマソ
768 :
764 :03/02/01 01:49 ID:ofCxo2ei
test
770 :
nobodyさん :03/02/01 11:59 ID:E95fdX8s
mod_perl で動かすとApacheのエラーログに サブルーチンがなんたらかんたらと出ます。 なんでかな? Subroutine main redefined at /usr/local/apache/perl/main.cgi line 16 (#1) (W redefine) You redefined a subroutine. To suppress this warning, say { no warnings; eval "sub name { ... }"; }
771 :
nobodyさん :03/02/01 12:16 ID:0/Z0vaJ7
774 :
nobodyさん :03/02/01 12:27 ID:E95fdX8s
>>772 やだ。
>>773 それはないです。
perl -c で実行してもOK。
CGIで起動した時もOK。
mod_perl環境の時にだけエラーでる。
>>772 やだ。
>>773 それはないです。
perl -c で実行してもOK。
CGIで起動した時もOK。
mod_perl環境の時にだけエラーでる。
やだ?なら質問するな。
mod_perl(Apache::Registry)で動かしたいと思うなら、真面目に書かないと無理なんだよ。坊や。
Perlの入門書を見て勉強中ですが、 $|=1; としてバッファを・・・・ とか言われるのですが そもそもバッファとはなんぞや? と初心者の私は疑問をもつわけで・・ その辺をうまく説明していただけないでしょうか?
>>778 ダムだよ。ダム。
ちょろちょろとしか来ないデータをある程度貯めておいて一気に取り出したり、
速い流れを取りあえずせき止めておいて自分のペースでゆっくり処理したり。
そう言うことに使う入れ物だ。
>>778 「おーい、ちょっと倉庫からこけし100本持ってきてくれ。あ、一度に渡すのは1本でいいから」
倉庫に行って1本持って戻ってきて渡す。これを100回繰り返す。(バッファなし)
一旦倉庫から100本まとめて近くの机の上に持ってきて、そこから1本ずつ手渡す。(バッファあり)
この「近くの机の上」に相当するのがバッファ。
781 :
778 :03/02/01 16:47 ID:???
バッファあり、なしの違いはなんとなくわかったけど プログラムを組む上で バッファありとなしとでなんか変わりますか? たとえばsysread()とread()で、 結局読み出すんなら一緒だと初心者の私は思ふ。 そこらへんプログラムを書く人はどのように 使い分ける必要があるんだろ?
速度が数倍から数十倍違う。 こういうことに気をつけることをせずにプログラムを組んでいくと いずれ、「遅いぜっ!ヴァニラアイス!」 という感じで、体中を串刺しにされる運命を辿ることになる。
>>781 速度が全然違うよ。
バッファなしなんて遅すぎて使い物にならない。
……っていうのは、8ビット時代のお話。
Perlの場合、既にプラットフォーム上(UNIXなりWinなり)でバッファリングしてくれて
いるので、Perl自身がバッファリングしなくてもそれほど体感的な差はないと思う。
でも、バッファの考え方自体は覚えておいたほうがいいと思うよ。
ファイルを一旦リストに読み込んで処理…なんてのもバッファ的なやり方だし。
>>781 Socketを使う時はリアルタイムにやりとりが必要になるんで、
バッファを回避しないとまずい。
Perlで任意の時点でバッファをフラッシュする方法がわからん・・・fflushなんて関数もないし。 しかたないからunbufferedにしちゃっているけど。
$fh->flush;
>>785 私も知りませんでした。
>>786 FileHandleモジュールで、いいでしょうか。
調べたところIO::Handle由来の機能っぽいですね。
(FileHandleのドキュメントに無かった…)
旧来の書き方なら flush FH; とかですか。
IO::Fileじゃないと使えないぽい。 でも最近のFileHandleはIO::Fileを使うようになってるから、FileHandleでも使えるかも。
>>782 ちなみにバッファリング あり、なし
でどっちが速いの?
792 :
nobodyさん :03/02/01 21:32 ID:DN2rKwgG
当方、ActivePerl5.6とApacheHTTPServer2.0.43で自鯖を構築したのですが、 掲示板スクリプトを自鯖にUPしたところ、bbs.cgiが表示されません。 真っ白です。なぜでしょうか? ちなみに、管理モードに入るためのパスとログイン名入力のページは表示されます。 しかし、そこから、bbs.cgiに行っても、やはり真っ白です。
bbs.cgiなんてどこにでもあるようなものじゃわからん。 それにスレ違い。 ここはPerlのコーディングについてのスレッド。
795 :
nobodyさん :03/02/01 21:47 ID:DN2rKwgG
>>793 うっせぇぼけ。仕立てにでりゃ調子こいてんじゃねぇぞ。
答えれないだけだろ低スキル野郎。てめぇはチンカスほじって寝てろや。
796 :
nobodyさん :03/02/01 21:47 ID:DN2rKwgG
798 :
b :03/02/01 22:18 ID:???
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
24時間受付 090−8505−3086
URL
http://www.h5.dion.ne.jp/~grobal/ メール
[email protected] グローバル探偵事務局
ここで熱くならずに無視できたら大人!
悔しかったら自分で調べること。誰も怒らないから。
>>792 .795.796
プププ
哀れだね
>>802 ここで熱くならずに無視できなかったから子供?
〃┏━━ |. ノノソハ))) (\リリ ´ー`)リ < ファイルテスト演算子 (ニE(#つo⊂#) ファイルテスト演算子は、こんなことができる演算子だよ。 ・このファイルがあるかどうかチェック (-e) ・ファイル(ディレクトリ)が読めるかどうかチェック (-r) ・ファイル(ディレクトリ)に書けるかどうかチェック (-w) ・ファイルかどうかチェックする (-f) ・ディレクトリかどうかチェックする (-d) ・ファイルのバイト数をチェックする (-s) これくらい知ってるといいね。 実例だよ。 if ( -e "test.txt" ) { print "ファイルがあるよ"; } else { print "ファイルないよ"; } if ( -r "test.txt" ) { print "ファイルから読めるよ"; } else { print "ファイルから読めないよ"; } if ( -f "test.txt" ) { print "通常ファイルだよ"; } else { print "通常ファイルじゃないよ"; } $size = -s "test.txt"; print "$sizeバイト"; 他にもいろいろあるんだけど、また必要になりそうだったら説明するね。 ややこしい説明はなるべく避けたいからね。。 じゃあ次回は、他の文字列処理関係の関数を勉強するよ
807 :
厨房 :03/02/02 07:09 ID:45tlaHB9
置換に関する質問です。 $a = "aaa"; $b = "aa"; $a = ~s/^$b//; print "$a\n"; これを実行すると a という実行結果になると思うのですがなぜか 4294967295 という実行結果が出ました。。 なぜでしょう? perlのバージョンは 5.005_03 built for i386-freebsd です。。
808 :
マリモーマ ◆r6PDGT6Xd2 :03/02/02 07:20 ID:m/KRriEG
^$bのせいでは?
$a =~ s/^$b//;
810 :
厨房 :03/02/02 07:27 ID:45tlaHB9
811 :
nobodyさん :03/02/02 09:20 ID:mV23mEyN
自分でライブラリを作るんだけど、 package MYLIBRARY; sub new { ・・・ } とか書きますよね。 んで、このソースにも、ちゃんと my のチェックをしたいので、use strict を書こうと思うんですが、 use strict; package MYLIBRARY; sub new { ・・・ } とすべきか package MYLIBRARY; use strict; sub new { ・・・ } とすべきか迷ってます。 package よりも前に書くのと後に書くのはいっしょなんですか? それとも、なんか違うんですか?
813 :
nobodyさん :03/02/02 14:10 ID:pmlltvJ1
↓ここまとめられないかな? my($a)=&hoge(); @b=@$a; ↑ sub hoge { ------ return(\@a); }
814 :
nobodyさん :03/02/02 14:21 ID:pmlltvJ1
ごめんできた
816 :
nobodyさん :03/02/02 15:28 ID:6TL1miGW
>>815 >>814 じゃないけど、
@b=@{hoge()}
ってことでしょ。
配列のコピーが発生するからリファレンスのまま行った方がいいような気がするが
掲示板で $trip って入れてあるところにトリップ出せるような 機能のつけかた教えてください。
>>817 $trip = "トリップ";
面倒だからやめた。htmlファイルなめて正規表現で該当箇所置き換えろ。
819 :
e :03/02/02 16:07 ID:???
# ハンドル(トリップ) &jcode::tr(?$FORM{'FROM'}, '#', '#'); if($FORM{'FROM'} =~ /([^?#]*)?#(.+)/){ my $main_message = $1; my $handle_pass = $2; my $change_salt = substr($handle_pass, , 1) . "H"; $handle_pass = substr(crypt($handle_pass, $change_salt), -8); if($main_message ne ""){ $FORM{'FROM'} = "$main_message </b>◆$handle_pass <b>"; }else{ $FORM{'FROM'} = "</b> ◆$handle_pass <b>"; } }
そういうのはCGI改造スレでやってくれ。
821 :
727 :03/02/02 21:03 ID:ionxQd5/
require 'cgi-lib.pl'; &ReadPlarse(*form); require 'jcode.pl'; &jcode'convert(*form,'sjis'); $data = $form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n open(ENQ, ">>$enqdata.dat")||do{print "ERR";exit;}; #flock(ENQ, 2); print ENQ $data; #flock(ENQ, 8); close(ENQ); print "Content-type:text/html\n\n"; print >> "END_OF_HTML"; <HTML> <HEAD> <TITEL>有難う御座いました</TITLE> </HEAD> <BODY> アンケートは送信されました!<BR> またのお越しをお待ちしています </BODY> </HTML> END_OF_HTML これを実行したら Backslash found where operator expected at enquetesys.pl line 11, near "}\" (Missing operator before \?) syntax error at enquetesys.pl line 11, near "}\" enquetesys.pl had compilation errors. ってえらーがでました。 落してきたソフトを実行しただけなのになんでエラーがでるのでしょうか?
823 :
nobodyさん :03/02/02 21:10 ID:lbpBAa4z
ファイルハンドルの配列というのはできないのでしょうか? $MAX = 2; @NAME = ('a','b'); for($i=0;$i<$MAX;$i++){ open(@FILE, "./$NAME[$i].txt"); } これだとエラーになってしまいました。 上記のコードのミス、もしくは何か他の方法がありましたらアドバイスお願いします
>>823 って言うかそんないっぺんにファイル開いて何する気よ?
>>821 エラーメッセージちゃんと理解するように努力しろよ。
英語分かんなかったら又厨房からやり直せ
>>821 >$data = $form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n
$data = "$form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n";
>print >> "END_OF_HTML";
print <<"END_OF_HTML";
そして最後の改行も忘れずに。
>>826 さて、厨房を甘やかした代償がいかに大きいかわかってないバカがいるわけだが。
829 :
nobodyさん :03/02/02 21:23 ID:GIziK5Md
mod_perl では exit()が使えないんらしいんだけど・・・ どうすんの? exit()なしで終り?
831 :
h :03/02/02 21:33 ID:skZYA3IH
他にも書いちゃ単ですが・・・ ローカルでCGIを動かしたところ,うまく動作しました。 で,インターネットテンポラリーファイルとクッキーを削除したら クッキーが復活しません。 どうしたらいいですか?
データファイルをまとめるCGIを作っているのですが、 日本語検索がうまくいきません。 if($test =~ /テスト/) だとエラーになってしまいました。 jcodeというのもちゃんと入れました。 何かよい方法はないでしょうか?
>>832 jcode入れたところで標準の正規表現は英語用です。
834 :
826 :03/02/02 21:56 ID:???
がーん( ̄A ̄||)
835 :
727 :03/02/02 22:43 ID:ionxQd5/
>>827 ありがとうございました。
って言うか。コンパイルエラーが出るようなプログラムを
PERL講座って感じで公開しないで欲しいですよ、まったく。
>>835 講座である以上素人相手ではないのだから多少のミスはユーザ側で直して当然ということだろう。
実際、人の間違ったコードというのは課題としてよく使われる。
>>837 かと言って
>>727 が賢いわけでもあるまい。
そのヘボのスクリプトさえ使いこなせないわけだ。
840 :
h :03/02/03 00:15 ID:XAlS7Khu
ローカルでCGIを動かしたところ,クッキーが機能しました. で,クッキーを削除したら クッキーが機能しません。 クッキーを復活させるにはどうしたらいいですか?
またクッキーを食べさせろ。
843 :
nobodyさん :03/02/03 07:12 ID:JvqhDUOZ
日本語が混じったファイルの整理をするCGIを作りってるのですが、 ↓のようなモノを数人分をtableでまとめようとしています -------------------- あああ 123回 いい 11回 うううう 50回 ---------------------- このような感じで文字は左端にそろえてあり、 回数のほうは「回」の部分でそろえられています。 この場合どのようにしたら回数の部分を読み込めるのでしょうか? まず、日本語検索をしようとしてもエラーになってしまい、 もし日本語検索がうまくいったとしてもそのあとはどうすればよいのかと、 試行錯誤しております。 何かアドバイスありましたらご教授お願いします
>843 EUCで処理。 正規表現で抜き出す。 > もし日本語検索がうまくいったとしてもそのあとはどうすればよいのか 知らんよ、おまいの心は漏れにとどかんとよ。
$_ = 'あああ 123回'; /(\d+)/; print $1,"\n";
>>843 データのフォーマットから見直すべき。
整形は出力時にやれ。
847 :
nobodyさん :03/02/03 10:42 ID:D3Jh7Sun
すいません、本当はEXCELのVBとかでやるべきことなのかもしれませんが、
自分はperlに関して少々の知識があるくらいなので質問させていただきます。
htmlで、各人の名前にリンクでメールアドレスがついてるソース
例えば
<a href="mailto:
[email protected] ">AAA</a><br>
<a href="mailto:
[email protected] ">BBB</a><br>
<a href="mailto:
[email protected] ">CCC</a><br>
.
.
.
みたいになってるときに、ソースをテキストファイルとして保存し、それを読み込んで
メールアドレスだけ取得し、別のテキストに書き出したいのですが、どうやって検索したら
アドレスだけ抽出できますか?
自分ではアドレスには前にmailto:があり、最後は(自分の場合は携帯アドレスなので).jpで終わってる
ので、この間にある部分をすべてとるようにしたいのですが、可能ですか?
>>847 できるよ...
つーか2,3個前のレスぐらい嫁。
おんなじようなことやってるやん。
>>847 @mail = map { /mailto:(.+?)"/ and $1 } @html;
850 :
nobodyさん :03/02/03 12:01 ID:D3Jh7Sun
>>848 >>849 ありがとうございます。perlに関する知識があるとはいえ、ソースの意味が
なんとなくわかる程度なので、作るとなるとごく基本的な事もあやふやです。
#!/usr/bin/perl
$datafile = "./mail.dat";
$sortfile = "./sort.dat";
open(LOG,"$datafile");
@html = <LOG>;
close(LOG);
@mail = map { /mailto:(.+?)"/ and $1 } @html;
open(FILE, ">$sortfile");
print $mail;
close FILE;
exit;
どこがおかしいですか?お願いします☆
Perl2EXEの使い方、または参考になるページを ご存じの方がいらっしゃいましたら教えてください。
>>850 perlに関する知識があるのにソースの意味がなんとなくわかる程度なのか?
おかしいのはチミの頭だYO
ちなみに漏れにはperlの知識は殆ど無い
print FILE $mail;
文字列のバイト数を改行コード「\n」込みで算出したいのですが、 なにか良い方法はありますでしょうか? 今の自分のレベルでは、 $string = qq(「\\n」が含まれた任意の文字列。\nThe arbitrary character sequences in which '\\n' was contained.); $length = scalar(map{1} unpack("C*",$string)); print "任意の文字列 \$string の総バイト数は $length です。\n"; くらいしか思い付きませんでした。 もうすこし賢い方法ってありますでしょうか?
$mailってな(ry
と、すると・・・ print FILE @mail; かな?
$ perl -ne '/mailto:(.+?)"/ && print "$1\n"' mail.dat >sort.dat は嫌?
>853 length() だと不都合あるの?
バイト数だからな
length()で得られるのはバイト数なんだが。 もちろん改行コードとか全部込みで。
昔罠
861 :
nobodyさん :03/02/03 20:53 ID:D3Jh7Sun
862 :
nobodyさん :03/02/03 22:05 ID:gGc+aOjU
xpにはロック処理いらないんですか? カウンターみたいの作ってdos窓11個で ロック処理無しで同時進行しても0にならないんですけど。
863 :
862 :03/02/03 22:06 ID:gGc+aOjU
あっ、カウンターは無限ループさせてやってますです。
>>862 そら、一プロセスからなら何回ループさせようが呼び出しはシーケンシャルなのだから正常に処理されるだろう。
根本的に理解が足りてない予感。
866 :
862 :03/02/03 22:58 ID:gGc+aOjU
あれ?DOS窓開きまくって同時実行しても1プロセスなんですか?
win98の時同じ事を試したら
見事に空ファイルができたと思ったのですが。
>>864-865 どうもありがとう。
867 :
nobodyさん :03/02/03 23:04 ID:1c8W3GXA
@file = <FILE>; $line_num = @file; 以外で行数を取得する方法はありますか? 一行ずつ読み込んでカウンタを回すのもなしで
でかいファイルを扱いたいから。この方法だとメモリを食うor時間がかかる
>>867 while (read(IN, my $buf, 8192)) {
$lines += ($buf =~ tr/\n//);
}
これでええんでないの?メモリ消費も少なめで、簡単だし。 ++ $count while (<FILE>);
括弧は省略できたみたい。関係ないけど。 ++ $count while <STDIN>;
>>860 > 昔罠
昔と今でlength()の何がちがうの?
876 :
:03/02/04 00:17 ID:rUOqBsxa
100行くらいのマスターデータがあって、ある行だけ上書き(更新)したいん ですけど、一行づつループかけて、マッチした行以外をTMPファイルへ書き 込み。吐き出したデータを読み込んで、マスターデータに(>)上書き。 更新したい行をマスターデータに追加書き込み(>>)って方法でいいんでしょ うか?行の順番はどうなってもよいです。 なんか、スマートな方法があったらご指導ください。
open(IN, 'master'); open(OUT, '>master.tmp'); while (IN) { if () { print OUT 新しいもの; } else { print OUT $_; } } rename('master.tmp', 'master');
>>876 マルチするほどの事じゃないだろ。どうせ見るヤツかぶってるんだし。
100行くらいならメモリに入れておいてもいいんじゃない?
メモリの量が気になるなら読み込みつつ別ファイルに書き込み。
マッチしたらその行だけ変更して最後まで読み書きする。
最後にリネームして終わりだな。
つか今度マルチしたらグーで殴るからね
881 :
nobodyさん :03/02/04 01:02 ID:Z72oZy+O
printの中で変数を展開したいのですが、どうすればいいのですか? $i = 1; print "$i+1"; で'2'と出力したのですが。
882 :
nobodyさん :03/02/04 01:08 ID:eARYiwGA
print $i+1;
print "${\( $i + 1 )}"; print "@{[ $i + 1 ]}";
-M の返す値って実際何を表してるんですか? 出力してみても何だかわかんなくて。
886 :
nobodyさん :03/02/04 02:04 ID:CHyA5DeQ
win98にApacheとActivePerlを入れたんですがCGIファイルを実行すると Forbiddenと出てしまいます。どこの設定がおかしいのでしょうか?
>>885 最後にファイルを修正してからの日数じゃないの?
てか -Mだけじゃ分からんだろ(w perl -Mの意味かと思った。
>>886 何を参考に設定したのか知らないけど、もう一度apacheの設定の仕方を見てごらん。
まぁエラーログみれば原因分かるから、それを元に検索するのも勉強。
888 :
nobodyさん :03/02/04 03:42 ID:VBD/sziN
if($a and $b){ 処理 } は、$aと$bに何か入っていたら処理するで実際OKなのですが、 unless($a and $b){ 処理 } ですと、両方入ってなかったら処理って風にならく、 どちらか一方でも処理に行ってしまいます。 ifのまるっきり反対じゃないんですね。何か訳があるのでしょうか?
890 :
888 :03/02/04 03:53 ID:???
ド・モルガンて名前を思い出せなくて遅れをとったYO!
892 :
876 :03/02/04 09:15 ID:???
すいません。。。 マルチするつもりじゃなかったんですが、書き込みした後、リロード して確認したら書き込まれていなかったもので、スレまちがえて再書き込みして しまいました。ご迷惑おかけしました。 いろいろなアドバイスありがとうございました。今日、がんばってみます。
>>888 unlessってのは、評価の結果が偽のときに実行するという命令であって、
条件式の評価の仕方が逆になるわけではない。
慣れないうちは、if (! 式) {} を使っておいたほうがいい。
894 :
nobodyさん :03/02/04 12:16 ID:ZSr84PG1
ハッシュに入れた日本語をforeachでeucにしたいのですが期待通りの結果になってくれません。 %TEST = ('A' =>'あ', 'B' => 'い'); foreach $key(keys %TEST){ &jcode'convert(*$key, "euc"); } このやり方では駄目なのでしょうか?
>>894 keyをコンバートしてどないするん。
&jcode'convert(*$TEST{$key}, "euc");
やな。
は! なんとマヌケな… ありがとうございました! 以後気をつけます。
おう、気をつけろよ
最近妙にネタが多い気がする。
899 :
711 :03/02/04 14:42 ID:???
オンライン翻訳についてT電子に問い合わせたら、年50万とか言われた。 なんかもう自分で作りたくなっちゃったよ。PERLでcgi形式で翻訳スクリプト なんて作ったら、どうなるんだろ。無謀か。
>>899 翻訳スクリプト作れるくらいの英語力(?)があったら翻訳スクリプトなんて必要ない。
CGI質問スレに間違えて書き込んでしまったので、以下コピペになりますが。 ファイルを、while (<IN>) {〜}といった記述をしないで、 一行ずつ読み込んでいく方法はないものでしょうか。 @file = <IN> といったメモリにファイル全部読み込む方法は使わず、 一行ずつ読み込んで、一行ごとに違う処理をしていきたいのです。 while の中でループ回数カウントしてifで判定しろ、なんていうのはなしで。 ファイルを一行読み込む場合、 open(IN,"$logfile"); $line = <IN>; と、やれば出きるのはどこにでも書いてあるのですが、 2度目以降 $line = <IN> としても空でした…。 Perl は一行ごとに分けるデータ構造が身についてしまってるのがダメなのかなぁ…。 seek と read 使えばよさそうなのは解ってはいるのですが、 ベースから書き換えなくてはならず、このままの構造でなんとかできないものかと。
>>899 変に訳されるよりはむしろ原文のままのほうがいいな…
infoseekのテキスト翻訳ってGETで送るのか。 変なの。
>>902 んなこたーない。
これを実行してみればわかる。
#!/usr/bin/perl
use strict;
our $buffer;
$buffer = <DATA>;
print $buffer;
$buffer = <DATA>;
print $buffer;
$buffer = <DATA>;
print $buffer;
__DATA__
foo
bar
baz
906 :
902 :03/02/04 18:00 ID:???
ほんとだ、できてますね; どこか初歩的なミスしてそうなので探してみます。 どうもでした。
907 :
894 :03/02/04 18:35 ID:???
>>895 さんが教えてくれた通りにやったのですがまたエラーになってしまいました。
これは他の部分がやばいのでしょうか?
909 :
nobodyさん :03/02/04 20:00 ID:ifLjuw1e
gzip展開したいんですど、 open F,"/bin/gzip -d temp.txt.gz |"; できません。 どうすれば良いでしょうか。
910 :
909 :03/02/04 20:12 ID:???
あースマソ、できてたわ。 出力先間違ってた。 失礼しました〜
>>902 >ファイルを、while (<IN>) {〜}といった記述をしないで、
>一行ずつ読み込んでいく方法はないものでしょうか。
意味不明
while (<IN>) は while($_ = <IN>)と同じ
要するに一行ずつ読み込んでいる。
>Perl は一行ごとに分けるデータ構造が身についてしまってるのがダメなのかなぁ…。
身についてないと思うよ。
912 :
711 :03/02/04 21:43 ID:???
>>912 恐ろしく電波な掲示板になること請け合いだな。
>>912 infoseekはネタでしょ。では、数ヶ月ならバレナイト思われ。
915 :
711 :03/02/04 22:37 ID:???
捕らぬ狸のじゃないですけど、翻訳掲示板が変に繁盛し出したら
いずれはバレてしまうんでしょうね。
上のLingaphileのように、フリーの翻訳ソフトは色々
開発されてはいるようですが。
GPLTrans
http://www.translator.cx/ (こっちはCとPHP?)
916 :
894 :03/02/05 07:12 ID:???
>>908 エラーの内容といいますと?
インターネットサーバーエラーって画面以外にもエラーってあるんですか?
一応&jcode'convert(*{$TEST{$key}}, "euc");
こんな感じにしたらエラーはでなくなりました。
しかしeucにコンバートされてないみたいです。
普通にスカラーを作って日本語を入れて検索した場合は成功しますし、
上記のハッシュに英語をいれてもちゃんとなります。
原因のわかる方がいましたらお願いします。
>インターネットサーバーエラーって画面以外にもエラーってあるんですか? 自分のPCにPERLをインストールして、それを使ってテストする。 そうすればもっと詳しいエラーメッセージが見れる。
つぅかリモートサーバでCGIのテストしてんじゃねぇよボケと。
>>916 Internalすら読めないのに、よくPerlのコードを書けるねえ。
意外とエラーの実体はタイプミスだったりしてな。
とりあえずレンタル鯖でのCGIテストは今すぐやめろ。
初心者未満のプログラマはエラーメッセージに意味があることを知らない。 よって、彼には500 Internal Server Eroorで十分だったわけだ。要はエラーが起こったという事実が大切なのだから。 実行したらエラーが出ました。助けてください。 と言う質問がいかに多いか。
突っ込んでいい? Eroor
(゚д゚)エロォア!!
(゚д゚)エルゥア!!
924 :
894 :03/02/05 14:37 ID:???
internalでしたか。すいません。 レンタル鯖でのテストはしてませんが? activeprelとapacheを入れてIEのアドレスにPCのアドレスを入れてやってます。
926 :
895 :03/02/05 14:53 ID:???
他の連中に怒られそうだがまぁ… use strict; require 'jcode.pl'; my %TEST = ('A' =>'あ', 'B' => 'い'); my $key; foreach $key(keys %TEST){ jcode'convert(\$TEST{$key}, "euc"); } これで動くだろ。
927 :
894 :03/02/05 16:22 ID:???
ありがとうございます。 895さん、925さん、その他の方にも迷惑をおかけしました。 もう少し基礎を覚え直します
>百年早い。 100年前にperlはない罠
> 100年前にperlはない罠 100年後にもPerlはない罠
>>926 少し直してみました。
use strict;
require 'jcode.pl';
my %TEST = ('A' => 'あ', 'B' => 'い');
foreach my $key (keys %TEST){
jcode::convert(\$TEST{$key}, 'euc');
}
#メモリを節約:
while (my ($key, undef) = each %TEST) {
jcode::convert(\$TEST{$key}, 'euc');
}
#他のやりかた
foreach my $value (@TEST{keys %TEST}) {
jcode::convert(\$value, 'euc');
}
keyを使わないならvaluesで取り出せば良いのでは。 とか、テストコードに言うのは野暮か。
メモリを節約するには、どういったことに 気をつければ良いのでしょうか。
>>932 無駄にリストとかハッシュを多用しない。
リファレンスが使えるところはなるべくリファレンスを使う。
数列から先頭の文字だけ削除する スマートな方法はないでしょうか? $last = @DATA; @DATA = @DATA[1..$last]
@DATAのリストから先頭要素を削除したいなら shift @DATA;
936 :
934 :03/02/06 00:34 ID:???
>>931 3つ目で、valuesを使わない理由は、valuesで出てきたリストに対する
変更は、%TESTに反映されないから、です。
ってそういう意味じゃないか。
>>934 @DATA = @DATA[1..$#DATA];
の間違いだね。
939 :
934 :03/02/06 01:46 ID:???
>@DATA = @DATA[1..$#DATA]; $#DATAで、配列の最後の番号ということでしょうか? これは応用が利きそうですね。
. . . 200212.txt 200301.txt 200302.txt こういう年月の名前のファイルを作り出すプログラムで、そのテキストの中の数字を全部足していきたいので open(IN,"200301.txt"); open(IN,"200302.txt"); こんな感じで一個一個開いて足しているのですが、 指定した月から現在の月までのファイルを開くような方法があれば教えてください
>>940 readdirでファイルリストを取得して
foreach等で回しつつ、
substrや正規表現で数字を切り出して、
if($xxx >= 200212)
などという条件つけてやれば?
または、予め何月以上というリストを作ってやって、
回しつつif (-e "$_.txt")で処理するか。
>>940 さらにこれからはもう一つ、
年月と数値だけ羅列したインデックスファイルを作っておくと便利だと思うよ。
・
・
200302<>5648
200303<>4421
>>940 そのファイル名が「4桁年2桁月」になっているのであれば、、、
$start = "200201";
$end = "200301";
foreach ($start .. $end) {
open(IN,"$_.txt");
何らかの処理
}
でよいのでは?
200213.txtが開けません。
947 :
942 :03/02/06 17:30 ID:???
時間によって何か処理をしたい場合、 例えば任意日任意時の10〜20分の間に何か処理をするとして ($minは分) if($min >= 10 and $min <= 19){⊂} と if($min =~ /1[\d]/){⊂} とやるのはどっちが高速&負荷軽めですか? つーかもっといい方法ありますでしょうか?
文字切れちゃったけど Benchmark.pm use Benchmarkね。
>>940 my ($start, $end) = (200201, 200312);
my $cnt = $start;
while($cnt <= $end){
print $cnt, ".txt\n"; # なにかしら処理
my ($year, $month) = $cnt =~ /(\d\d\d\d)(\d\d)/;
$month++;
if ($month > 12){
$month = '01';
$year++;
}
$cnt = $year. $month;
}
単純に書いてみました。
>>948 処理の重さだけなら後者が約2.2倍重いです。
前者を200万回処理するのにかかった時間0.69秒
後者を200万回処理するのにかかった時間1.51秒
実験は当方ローカル環境(CPU2.5GHz)
定期的に処理をしたいのであれば、UNIXコマンドのcronがありますが、
借りているサーバがshellを許可しているか、コントロールパネルにより
提供している必要がります。
953 :
郵政の歴史年表 :03/02/06 21:24 ID:iDPmTn07
>>953 できるよ。
まず、そのサイトのデータを全部ダウンロードしてローカルに置きましょう。
(以下略)
ローカルに置いてからperlを使ってsystem("/bin/grep")てな感じ。 そうじゃないだろ・・・・
<tr> <td valign=top nowrap><b>([^<]*)</b></td> <td> <tr> <td valign=top><font color=(?:ff9cff|9cff31|0031ff)>●</font></td> <td>([^<]*)</td> </tr>
>>948 はっきりいってそんなのperlの起動コストやI/Oコストに比べればゴミみたいなもん
分かりやすい方選んどき
959 :
nobodyさん :03/02/07 03:13 ID:Md2X1ufV
POSTで受け取ったファイルの、 アップロードする前のオリジナルネームは どこを参照すればわかるのでしょうか? 環境変数 Perl 一覧 などとググっても見つけられませんでした。 よろしくご教示ください。
>>960 なるほど。格納されている場所がわかりました。
実際の取得方法(スカラー変数への代入)を調べてみます。
ありがとうございました。
962 :
nobodyさん :03/02/07 16:46 ID:04vl2wLA
指定したディレクトリにあるファイルのファイル名を 全て配列に代入するにはどうすればいいんでしょうか? 例えば、cgi本体と同じ階層にある「log」というディレクトリに 0.dat,1.dat,2.datがある時に、 最終的に@dataに0.dat,1.dat,2.datが代入されている という風にするにはどうするのでしょうか?
opendir
>>962 サブディレクトリもでしょ。.とか..とかのディレクトリは
入れないんでしょ。これでいいと思うよ。
#!/usr/local/bin/perl
# コマンドラインで指定したディレクトリの中にあるすべてのファイルを配列に入れる
$usage = 'perl files-in-dir.pl 絶対パス';
$starting_dir = shift;
die $usage if $starting_dir eq "";
sub search {
my($dir, $depth) = @_;
my $handle = "DIR$depth";
opendir($handle, $dir) or die $!;
while($file = readdir($handle)) {
next if $file =~ /^\.{1,2}$/;
if (-d "$dir/$file") {
&search("$dir/$file", $depth + 1);
} else {
push(@files, $file);
}
}
closedir($handle);
}
search("$starting_dir", 1);
for(@files) {
print;
}
966 :
962 :03/02/07 17:40 ID:???
解決しました。皆さんありがとうございました。
モジュール使えよ
Perl初心者さんへ、世の中PHPに移行する中、 なんでPerlを覚えてるの? 借りてるサーバがPerlしか使えないとかかな? マジレスきぼん。
どんな世の中だっつの。おまえの頭の中のか?
>969 ( ´,_ゝ`) プッ
973 :
しょしんしゃ :03/02/08 00:26 ID:qxZih98+
ファイル処理プロセスが面倒 日本語処理が面倒 ソケット通信が未熟
社員番号 社員名 身長 体重 $no $name $heught $weight とする場合、身長の降順、同じ場合は体重の昇順に 体重まで同じ場合は、さらに社員番号の昇順に 社員番号、社員名、身長、体重をprintしたい場合は どうしたらよいでしょうか?(複数キー)
975 :
940 :03/02/08 01:27 ID:???
ありがとうございました
>>974 まずは色々とやってみる。
それでだめならぐぐる。
それくらいのことをしないと初心者とは認定されませぬぞ。
977 :
974 :03/02/08 02:37 ID:???
>>976 失礼しました。一応自分で書いてみてテストした結果、
下記のやり方で問題なかったのですが文法的におかしい
ところ、他に綺麗なやり方がありましたらご教授下さい。
(とくに下記の場合3つのキーとしているのに「keys %hei」
だけでもよろしいのでしょうか?)
open(FILE);
while (<FILE>) {
($no,$name,$height,$weight) = split(/<>/);
$nam{$no} = $name;
$hei{$no} = $height;
$wei{$no} = $weight;
}
close(FILE);
foreach $no (sort { ($hei{$b} <=> $hei{$a}) || $wei{$a} cmp $wei{$b} || $no{$a} cmp $no{$b} } keys %hei) {
print "$no $nam{$no} $hei{$no} $wei{$no}<BR>";
}
掲示板の名前表示にトリップ機能を追加しようとおもいます。 トリップ変換のアルゴリズムはその辺のトリップチェッカーを拾ったんで途中に割り込ませようとおもいます。 で、すでにできあがってる2chスクリプトなのですこし強引ですが名前をdatファイルに保存する際に 投稿の際に名前入力してそれをdatファイルに保存してるのがread.cgiだと決めつけて考えてます。 空の変数$karinameを用意してそこに正規の名前変数$nameを代入して料理しよかと思いました。 まず最初に良く分らないのが文字列変数$nameに"#"が入ってる時だけ"#"以降の文字列抜き出しをするに はどいう形の分がいいんでしょうか? さらに抜き出せたとしてそれを変換ルーチンで料理。もう一つ用意した$ryouriに代入 $name=$ryouri で元にかえしてやってその後は通常の流れに続くという方法でよいでしょうか? 雑な質問のしかたで申し訳ないです。よろしくお願いします
>>977 こんなデータを作ってみました。
33<>c<>169<>120
22<>b<>169<>68
1<>a<>169<>68
正しくはa,b,cさんの順ですよね?
>>978 正規表現でマッチング。
980 :
:03/02/08 04:12 ID:???
>>978 こんな感じ?
$name =~ s/?#(.+)/&trip($1)/eg;
sub trip {
my ($conv) = @_;
my $conv = substr(crypt($conv, $salt), -8);
($conv);
}
264 :本7 ◆HON7/awDa. [sage]:03/02/07 20:34 この早さでは言いにくいが 旧2ch式BBS立てたけど誰も来ない
>>977 > open(FILE);
本当に問題ないの?
--- test.dat ---
ABC-001<>foo<>165<>65
ABC-002<>bar<>170<>70
ABC-003<>baz<>170<>65
ABC-004<>boo<>170<>65
---
my $file = './test.dat';
open FILE, '<' . $file or die;
my(@item, @person) = qw(i n h w);
chomp, @{$person[$. - 1]}{@item} = split /<>/ while <FILE>;
close FILE;
print map "@{$_}{@item}<BR>\n",
sort {
$b->{'h'} <=> $a->{'h'} ||
$a->{'w'} <=> $b->{'w'} ||
$a->{'i'} cmp $b->{'i'}
} @person;
参考。
http://www.google.co.jp/search?q=Schwartzian+Transform&hl=ja&lr=lang_ja
>>982 どうだ、凄いだろ、俺のチンチン!っていう回答
熟女は喜ぶが処女は痛がる
>>980 アドバイスありがとうございます
抜き取った文字列はどこに代入されるのでしょうか?
どしろうとで申し訳ないです
>>985 勝手に置換されるように書いてあるぞう。わからなくてもとりあえず読んでみよう。
987 :
:03/02/08 23:04 ID:???
backslashが文字化けた。 $name =~ s/¥#(.+)/&trip($1)/eg; #の後の(.+)がトリップ用数字に相当。 (.+)が$1に入って、 これにsub tripで処理したものを、 元のやつと置換する。 $name = "私の名前 #123456"; が $name = "私の名前 aKsdjA4w"; みたくなる。
988 :
nobodyさん :03/02/08 23:15 ID:r91Y0UUN
open F,"+<$file"; while(<F>){print;} seek F,0,0; print F $temp; close F; としたとき、$tempのサイズが元のファイルサイズより小さいと、 $fileの元のデータが後半残ったまま上書きされてしまいました。 これはやはり上書きモードで開き直さなければ駄目でしょうか。
>>988 わかんないけど、seek後truncateしてみたら?
>>986 なれこれいじいったらトリップ入ってないときはそのままで出力できるようになりました。
あとは◆を名前欄に入れたら◇になるよう改造してみます
例えば、
http://www.yahoo.co.jp/ のソースを $st バイトから $to バイトまでのみ
ネットワーク通信によって取得するにはどうすればいいですか?
LWPとかSocketとか頑張って調べましたがわかりません
よろしくお願いします。
>>992 もうちょっとSocketとHTTPの勉強すればいいよ。
perlのmyって変数を続けて書くと最初のやつ以外はmy変数じゃなくなってしまうんですか? 例: my $i; # ←はmy変数 my $i,$j,$k; # ←は$iだけがmy変数(残りはglobal?) my ($i,$j,$k);# ←は全てmy変数 ↑このような認識でいいのですか?
myは関数じゃないからそうなるんだよーん。
>>995 myは関数です。
ついでにいえばreturnも関数です。
このスレは終わらんのか?
999 :
nobodyさん :03/02/09 00:17 ID:zusUFu+4
次スレあるの?
1000 :
nobodyさん :03/02/09 00:17 ID:zusUFu+4
ついでに1000
あ、誰も>
>>999 に答えられなくなっちゃうや。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。