トップページ⇒php
1001コメント313KB

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/02/09 00:24ID:s0tpWWxg
初めに→「perl」その物のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

あとは>>2-10。
0039本7 ◆HON7/awDa. 03/02/09 20:15ID:???
おかげさまでなんとかトリップ機能が動きました。
でもまだ問題があってindexを開いた際にクッキー情報の名前もトリップ変換してしまい名前欄を
はみだしてしまいます。
396行の名無しさん処理のunless()のあとelse{}で398行〜425行のトリップ処理を加えました。
これを何行目あたりに入れることでこのバグを回避できますか?
自分でも悩んでるんですどうも全体の流れがつかめないもので・・


こちらでソースは更新しました。
http://hon7.hp.infoseek.co.jp/cgi-bin/test/bbs3.txt

よろしくお願いします
0040nobodyさん03/02/09 20:26ID:???
>>39
マルチポストすんなぼけ!
0041本7 ◆HON7/awDa. 03/02/09 20:37ID:???
あれ?誤爆ですた。すんません
0042nobodyさん03/02/09 21:07ID:???
2chのようなID制を作成したいんですが、どういった仕組みで動かせばいいんでしょうか?
自分なりに
1、 210.135.129.41 を点ごとに4つに分解
2、分解した後ろ3つと日付を掛ける [135] * [129] * [41] * [day]
3、数字からひたすらアルファベットに置き換える

としているんですが、全くランダム制がなく困っています
0043本7 ◆HON7/awDa. 03/02/09 21:17ID:???
>>42
2chだってランダム性は少なくてクラウンで同一の串なら同じIDだったような
0044nobodyさん03/02/09 21:21ID:???
>>42
IPを8ケタの16進数にして、日付を種(SALT)にしてcrypt、ってのはどうか。
0045nobodyさん03/02/09 21:45ID:???
>>43
あのね、クラウンは日付を種にしてないだけなの。
他の鯖は日付ごとに変わるでしょう?
0046nobodyさん03/02/09 22:04ID:???
crypt試してみました
どうやら先頭2文字がsaltそのままみたいですね
とりあえず、先頭の文字だけ切って表示するようにしときます
0047nobodyさん03/02/10 00:36ID:???
掲示板を作ってるんですが質問があります。
書き込みボタン押して本文が無かったらリロードというのをしたいです。
どうもうまくいかないみたいで・・・
ご教授お願いします。
0048nobodyさん03/02/10 00:46ID:???
>>47
どううまくいかないの?

上のほうにもあるけど、「うまくいかない」だけじゃわかんないよ。
どうなるか必ず書くこと。エラーメッセージもあれば書くこと。
0049nobodyさん03/02/10 00:46ID:???
if ($honbun eq "" ) { print "リロードタグ"}
0050nobodyさん03/02/10 02:56ID:???
>>14
0051nobodyさん03/02/10 04:15ID:???
>>50 >>14
SDBMにはロック機構がないようなので、
独自で排他処理をしないと駄目な感じですね。

ファイルロックで包む例。
ttp://cat.zero.ad.jp/mouse/download/log/dblog2/ezlog_cgi.txt

もしくは、MLDBM::Sync モジュールを使う。
http://www.perldoc.com/cpan/MLDBM-Sync-0.07.tar.gz.html
0052nobodyさん03/02/10 04:20ID:???
しかし、データベースファイルに
テンポラリファイルを使うのはいかがなものかと。
00535003/02/10 04:35ID:lunjJQvX
>>51さんのように
SDBMをファイルロックで包む例はよくあるんだけど、
>>52さんの言うように
テンポラリファイルを使う例があまりないみたいなので質問してみたんですが、
どうなんでしょうかね?

ファイルロックが完璧ならばテンポラリファイルを使う必要もないと思うんですが。
0054実は…51==5203/02/10 05:05ID:???
テンポラリファイル必要なしに同意です。

flockが不安定または使えない場合は、
symlinkとかmkdirの擬似的なロックでもいいと思います。
DBM処理系によっては複数のファイルを作成したりしますので、
テンポラリは結構面倒かもしれません。
0055超初心者03/02/10 11:47ID:MIMhYBnE
カウンターを作っていますがうまく行きません。
トータル・今日・昨日をカウントさせたいのですが、
昨日・今日が上手くカウントしてくれないです。
0056超初心者03/02/10 11:48ID:MIMhYBnE
#!/usr/bin/perl

print "Content-type: text/html\n\n";
$logfile = './1.txt';
$ENV{'TZ'} = "JST-9";
$mday = (localtime(time))[3];
open(IN,"$logfile");
$coall =<IN>;
$cotod =<IN>;
$coyes =<IN>;
$day =<IN>;
close(IN);
chop $coall;
$coall++;
if($mday != $day){
$coyes = $cotod;
$cotod = "0";
$day = $mday;
}
chop $cotod;
$cotod++;
open(OUT,">$logfile");
print OUT "$coall\n";
print OUT "$cotod\n";
print OUT "$coyes\n";
print OUT "$day\n";
close(OUT);
print <<"HTML";
累計$coall人<BR>今日$cotod人<BR>昨日$coyes人
HTML
0057nobodyさん03/02/10 12:33ID:???
>>56
改行の扱い方が悪し。
とりあえず下記の変更でも動くけれど、良くないね。全体的に見直すべし。

close(IN);
chop $coall;
chop $cotod;
chop $coyes;
chop $day;
$coall++;
if($mday != $day){
$coyes = $cotod;
$cotod = "0";
$day = $mday;
}
#chop $cotod;
0058超初心者03/02/10 14:42ID:MIMhYBnE
>>57さん
有難う御座いました。勉強になりました。
0059nobodyさん03/02/10 22:19ID:???
遅レスだしもう解決したみたいだけど、

>>33
Unrecognized character \x81 と来たときには全角スペースがないか疑え。
(全角スペースはシフトJISで\x81\x40)
0060nobodyさん03/02/10 22:57ID:0mJjU+k6
自分のWebフォルダに無いPerlプログラムを別のところから利用するには
どうしたらいいですか?
色々試してみたんですがやりかたがわかりません
例えば↓のチャットを、自分独自の
自動更新チャットに作りかえるにはどうしたらいいですか?
http://www.tcup6.com/cgi-localbin/chat8.cgi

(別のところからログファイルだけ更新できるようなイメージ)
0061↓新語03/02/10 22:59ID:???
”Webフォルダ”
0062nobodyさん03/02/10 23:04ID:???
彼方此方カキコするのはヤメレ
0063nobodyさん03/02/10 23:09ID:???
Webフォルダってのはアレですか?
自分のパソコンの中に作った「Web」っていう名前のフォルダですか?
0064nobodyさん03/02/10 23:15ID:???
わかんなければ、ぐぐる、これキホン(・∀・)!!
http://www.google.co.jp/search?q=+Web%83t%83H%83%8B%83_&ie=Shift_JIS&hl=ja&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0065nobodyさん03/02/10 23:31ID:???
>>64
なるほど。勉強になった。サンクスコ


Perlと何の関係が……
0066nobodyさん03/02/10 23:58ID:???
>>64
トップのページ
http://www16.u-page.so-net.ne.jp/xb4/katsumi/os/windows/webdav/
閲覧するとポートをガンガン叩いてくるんですけど…。
0067 03/02/11 04:31ID:???
0068nobodyさん03/02/11 12:23ID:1RQcCB3w
クッキーについて質問です。
掲示板を作っていて、
名前とメール部分のクッキーの設定は上手く行ったんですけど、
URL欄のクッキー情報が上手く保存されません。
調べてみたら、http:のコロンが原因だとかなんとか・・・?

どう対処したら良いのか教えて下さい。。
0069nobodyさん03/02/11 12:33ID:???
適当にエンコードしてみる。
0070nobodyさん03/02/11 12:48ID:???
>>68
http://www.2ch.netクッキーに
とクッキーに保存するんじゃなくて
www.2ch.net/
とクッキーに保存する
0071nobodyさん03/02/11 12:58ID:???
www.2ch.net/hoge::hoge.html
0072nobodyさん03/02/11 13:25ID:???
ぜんぜんperlと関係ないし。
0073nobodyさん03/02/11 13:37ID:???
テキストファイルに
-------------
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
-------------
とあったとして、真ん中の行のみ書き換えるにはどうしたらいいんでしょう?
私のIQでは思いつきません
0074nobodyさん03/02/11 14:21ID:???
IQのことを考えるからできないのです。

こころの眼でみるのです。
0075行頭じゃなくてもソートできるの?03/02/11 15:22ID:QuXhKMT3
ふりがな,名前,郵便番号,住所

の列からなるCSVファイルを読み込んで
2番目以降の列(例えば名前の列)でSortしなおすことはできますか?
もしかして順番変えたテンポラリファイルを作らないとダメですか?
0076nobodyさん03/02/11 15:27ID:mp4tOM/v
cgiなどのファイルの記述で自分で初期設定する変数を
$set{top_path} = '../';
のように%setのハッシュにしてるのですが
こういうのって格好悪いですか?
0077 ◆hMJAPH9PWA 03/02/11 16:25ID:???
>>73
一度全て読み込み、書き換えてから書き戻すしかないね。

>>75
テンポラリファイルなんて使わなくてもできるよ。
データが巨大ならデータベースを使った方がいいと思うけどね。

>>76
格好はどうでもいいけど、
要素名のタイプミスをするとすぐ発見できないのが面倒かもね。
あと、若干だけど効率も悪いかな。
0078nobodyさん03/02/11 17:04ID:???
>>75
名前の列でソートするならこんな感じ。
データが多いとちょっと重いかもしれないが。
@hoge = sort { (split(/,/, $a))[1] cmp (split(/,/, $b))[1] } @hoge;

>>76
自分は最近それと似た方法で定数を記述してる。

my %const = {
  HOGE => '../',
  HUGA => 100
};

こんな感じで。
まあ、確かに効率は悪いけど、見た目がきれいだし、定数だというのが
はっきり分かるから。
0079nobodyさん03/02/11 18:28ID:???
>>78
どのバージョンにもつかえるわけないけど、
use constant {
HOGE => ’../’,
HUGA => 100,
};

とか書くのが美しくて速いと思う(インライン化されるから)
0080nobodyたん03/02/11 18:37ID:???
{} ではなくて ()
0081nobodyさん03/02/11 18:43ID:???
>>79
use constant は便利なんだけど、文字列の中では展開されないよね。
これさえなければもっと積極的に使いたいのだけど。
0082nobodyさん03/02/11 19:01ID:???
ファイルを読み書きするときのflockに関する記述として以下は正しいでしょうか?
open(OUT, "+<aaa.txt");
flock(OUT, 2);
print OUT "略";
close(OUT);
0083nobodyさん03/02/11 19:39ID:???
seekでファイルの末尾に移動してから書き込む。
00847503/02/11 20:10ID:???
>>78
激サンクス
0085nobodyさん03/02/11 21:39ID:???
>>81
use constant PI => 4 * atan2 (1, 1);
print "The value of PI is @{[ PI ]}.\n";
0086nobodyさん03/02/11 21:53ID:???
>>85
おお、そんな使い方ができたなんて初めて知ったYO!
今までconstantはコンパイル時に展開されるもんだと思い込んでた。
こんどから積極的に使ってみます。マリガトー
0087nobodyたん03/02/12 00:00ID:???
ちなみに、
use constant NOBODY => 774;
は
sub NOBODY { 774 }
ってするのと同じ。(constant.pm 参照)

0088nobodyさん03/02/12 00:34ID:9lI7mE1F
質問です。
$a = "aaaaaabababanfjfggkrwaafrwnlwa";
例えば$aの中に「a」と言う文字が何回現れるか数えられる関数はありますか?
0089nobodyさん03/02/12 00:37ID:???
>>88
それくらい自分でつくれば?
0090nobodyさん03/02/12 00:48ID:???
$count = $str =~ tr/a//;
009188 自己解決03/02/12 00:49ID:???
>>89
その回答からすると関数は無さそうですね。
0092nobodyさん03/02/12 01:05ID:???
>>85
print "The value of PI is ${\PI}.\n";
これじゃだめ?
0093nobodyさん03/02/12 03:08ID:???
>>92
いいらしいよ
0094nobodyさん03/02/12 06:41ID:???
>>86
print "The value of PI is @{[ PI ]}.\n";はconstant.pmの
中に書いてあるのをコピペしただけ。まあ、ドキュメントを
読みましょ!って事ッス。何故そうなるか?はperlrefを
見ましょ。これも、constant.pmの中に書いてある(藁
>>92 はその応用形ってことっしょ。
0095nobodyさん03/02/12 14:43ID:???
echo や print で生成したフォームからは値を受け取ることは出来ないですか?
0096nobodyさん03/02/12 14:46ID:???
すまん perlじゃなかった
0097nobodyさん03/02/12 18:49ID:60fo1D0F
($a,$b,$c) = (0,2,0) だとそれぞれの変数に代入できるのに
@{[($a,$b,$c)]}[0..2] = @{[(0,3,0)]}[0..2] だと無理なのはなぜですか?
↓みたいな感じです。

DB<10> ($a,$b,$c) = (0,2,0)

DB<11> print "($a,$b,$c)"
(0,2,0)
DB<12> @{[($a,$b,$c)]}[0..2] = @{[(0,3,0)]}[0..2]

DB<13> print "($a,$b,$c)"
(0,2,0)
DB<14> print @{[(0,3,0)]}[0..2]
030
DB<15> print @{[($a,$b,$c)]}[0..2]
020

0098nobodyさん03/02/12 20:29ID:???
($a,$b,$c) = (1,2,3);
print (@{[($a,$b,$c)]}[0..2] = @{[7,8,9]}[0..2]),"\n";
0099 ◆hMJAPH9PWA 03/02/12 21:33ID:???
>>97
[]演算子は引数のコピーによる配列リファレンスを作るからだよ。
つまり
@{[ $a, $b, $c ]} = (...)
は
my @tmp = ($a, $b, $c);
@tmp = (...);
と同じことになる。
01009203/02/12 21:34ID:???
>>93-94
ありがとん。perlrefに
>Here's a trick for interpolating a subroutine call into a string:
> print "My sub returned @{[mysub(1,2,3)]} that time.\n";
を見つけました。
constant.pmのコードからすると、>>87さんの言うと通りなので、
配列にするのが礼儀正しい方法みたいですね。
0101nobodyさん03/02/13 02:39ID:???
@{[]}は実行効率悪いよ
普通に、
print "My sub returned" . mysub(1,2,3) . "that time.\n";
の方がいいと思う
0102nobodyさん03/02/13 16:37ID:/En01Oe5
$moji1 = '111';
$moji2 = '110';
〜〜〜〜〜〜〜←ここの部分
$moji1 - $moji2 == 1

という風に文字列を数字に変換するにはどうしたらよいでしょうか?
0103nobodyさん03/02/13 16:47ID:???
質問です。

carrysun という携帯対応の掲示板(現在公開されていません)を使っています。

最近気づいたのですが、analogの結果を見ると 403エラーがたくさんでています。
access_logを見てみると、該当ディレクトリを GETしていてエラーがでています。

"GET /cgi-bin/csun/ HTTP/1.1" 403 xxx

このようなエラーです。
これがちょっとうざったいので、直したいのですが、csun.cgiを見てもどこで
そんなリクエストを出しているのかが掴めませんでした。

画像とかの指定かなと思ったんですが、何か調べる良い方法はありますでしょうか?
#ちなみにlocalのlinuxでテストできます。

何か簡単なアドバイスでも良いのでよろしくお願いします。
0104nobodyさん03/02/13 16:52ID:???
>>402
意味不明

>>403
http://www.google.co.jp/search?q=403+%83G%83%89%81%5B&ie=Shift_JIS&hl=ja&lr=
スレ違い。
0105nobodyさん03/02/13 16:53ID:???
>>104
意味不明なのはお前の方だ
0106nobodyさん03/02/13 16:54ID:???
>>104,105 ワラタ
0107nobodyさん03/02/13 16:58ID:???
>>403
/cgi-bin/csun/を代入している変数を探す。
その変数を探す。
0108nobodyさん03/02/13 16:58ID:???
>>103
ブラウザが勝手にルートたどったりするんじゃねーかな
関係ないかも知れんが、IEとかだとお気に入りアイコン探しまくってうざい
010910703/02/13 16:59ID:???
俺も思わず誤爆してしまった(藁
>>103だ。
011010403/02/13 17:03ID:???
ワリィワリィ
0111nobodyさん03/02/13 17:13ID:???
>>102
何もしなくてよい。
$moji1 = '111';
$moji2 = '110';
printf("\$moji1 - \$moji2 = %d\n", $moji1 - $moji2);
0112nobodyさん03/02/13 17:14ID:???
>>107
設定ファイル csun2.cgi を見るとサーバのディレクトリの設定は、

$server=qq|http://$ENV{'SERVER_NAME'}$ENV{'SCRIPT_NAME'}|;

これしかありません。
なので、ディレクトリを見に行くことはないはずなんですが...

画像ファイルの設定も
$pc_title_img='';
になってますが、ちゃんと処理してあって、空の場合はテキストのタイトルを
表示するようになっています。

あとは、どんな理由があるのか???
0113nobodyさん03/02/13 17:15ID:???
>>102
s/〜〜〜〜〜〜〜←ここの部分//;
0114nobodyさん03/02/13 17:16ID:???
>>112
配布元晒せ
0115nobodyさん03/02/13 17:25ID:???
>>114
現在配布していませんが、

http://applejam.cool.ne.jp/

です。
011610403/02/13 17:31ID:???
>>115
そのエラーがさ、cgiに原因があるとする理由は何?
0117nobodyさん03/02/13 17:37ID:???
>>115
# 戻り先URLを設定 --------------------------------------------------------------------- #

$pc_home ='../pc/index.html';# パソコン 用
$ez_home ='../ezweb/index.hdml';# EZweb 用
$i_home ='../imode/index.html';# i-Mode 用
$j_home ='../jsky/index.html';# J-SKY 用
$astel_home='../imode/index.html';# ドットi 用
はどうなってる。
0118nobodyさん03/02/13 17:39ID:???
>>116
サイトアクセス数(200 OK)の1/4が403エラー
access_logを見ると前後に必ずそのスクリプトの名前が出てくる。

/cgi-bin/csun/csun.cgi 200
/cgi-bin/csun/ 403
/cgi-bin/csun/csun.cgi 200

のような感じです。

同じ掲示板を4つ位使ってますが、どの掲示板でもエラーが出ます。


スクリプトの問題以外だとブラウザから直接ディレクトリを指定する
というのが考えられますが、それ以外に403エラーがでる理由はありますか?
0119nobodyさん03/02/13 17:42ID:???
>>118
多分出力されたHTMLを見ればわかる。
0120nobodyさん03/02/13 17:43ID:???
csun/index.htmlでも置いとけば。
0121nobodyさん03/02/13 17:43ID:???
cgi-binはScriptAliasされているんじゃ・・・
0122nobodyさん03/02/13 17:45ID:???
>>119
前に調べたのですが、異常はありませんでした。

>>120
これが一番いいかも知れません。ちょっと試してみます。

>>121
すみません。ちょっと意味がわかりません。
012310403/02/13 17:46ID:???
>>118
なるほど。
そういった根拠があれば何も言うことはないっす。
例えばどっかからリンクミスなURLが貼られてしまったとかだと、
バンバンリクエストが来る可能性があるもんで。
0124nobodyさん03/02/13 17:47ID:???
>>122
ところで、あんたはどうしたいんだ?
403でなくなればそれでいいのか? /cgi-bin/csunへのアクセスがなくなってほしいわけじゃないのか?
0125nobodyさん03/02/13 17:50ID:???
ところでスレ違いだぞ。CGIスレでやれよ
0126nobodyさん03/02/13 17:53ID:???
>>124
すみません、説明不足で。はじめに言うべきだったのかもしれません。

csun.cgiは、掲示板として正常に動いています。

ただ、analogのレポートを見たときに、あまりに403エラーが多いので、
(先ほど書いたようにサイトのアクセスの1/4)なくしたいだけです。
多分、csun.cgiにアクセスするたびにほぼ毎回403エラーが出ていると
思います。

実害が出ているというより、ただうざったいから、というのと色々スクリプト
を見てもわからないので、知的好奇心から原因を知りたくなったから、という
理由からです。
0127nobodyさん03/02/13 17:54ID:???
>>126
どうしてそうなるのか調べたいのなら、>>120はなんの解決にもならないだろう。
0128nobodyさん03/02/13 18:06ID:???
perlと全然関係ないじゃん
0129nobodyさん03/02/13 18:09ID:???
perlでデバッグする方法はないのでしょうか?

どの行がこのGETのリクエストを出しているのかを調べる方法があるのかと思ったの
ですがないですかね?
0130nobodyさん03/02/13 18:12ID:???
ステータスコード403はHTTP_FROBIDDEN。
アクセスログのリファラでも調べろ。
以上終了。
0131 03/02/14 12:58ID:mtrOCq/2
http://www.vclub-4wd.com/letstry/try1.html
これか?
0132nobodyさん03/02/14 13:32ID:???
色々アドバイスありがとうございました。
access_log の リファラをonにして調べていたところやっとわかりました。

csun2.cgi にて $background ='.'; となっており、

csun.cgi にて

<BODY BGCOLOR="$bgcolor" BACKGROUND="$background" TEXT="$text" LINK="$link
" VLINK="$vlink" ALINK="$alink">

となっていたためでした。
こんなことで本当に申し訳ありませんでした。
色々ありがとうございました。
0133nobodyさん03/02/14 15:52ID:???
やっぱり出力されたHTMLを見ればわかる事柄だったんじゃないか・・・人騒がせな。
0134nobodyさん03/02/14 17:09ID:aS0shCzv
ええと、Perlからwindowsのパス付きの共有フォルダにアクセスしたいんですが、、、
パス付きでも、実行マシンから既にアクセスしていたり(パスワードを入力済み)
実行マシンと同じID/PASSだったりすると特別めんどくさいことはないんでsuga
open FILE,"\\IPアドレスとかマシン名\xxxxx";
で開けますよね。
ただ、上記の条件をみたなさな、単純にパスワードが付いてるマシンの共有フォルダに
アクセスする場合、スクリプト側では、ID/PASSはもちろんしってるんですが
どうすれば開けるんでしょうか?
0135nobodyさん03/02/14 17:46ID:???
>>134
WNetAddConnection2を叩く。これ以上は板違いだから適切な板に移ってくれ。
013613403/02/14 19:54ID:aS0shCzv
>>135
そのヒントから
Win32::NetResource
にたどりつきました。。。ありがとうございます。
0137nobodyさん03/02/14 21:52ID:nq8/avY5
ページ内でパスワードを入力して、
正しいパスワードが入力されたら別のURLにジャンプしたいのですが
どうすればよいのでしょうか?
指定のURLにジャンプできるコマンドとかありますか?
0138nobodyさん03/02/14 22:06ID:???
>>137
locationまたはrefresh
0139nobodyさん03/02/14 22:28ID:???
>>137
えーっと、ここPerlスレだよね。

……そんなコマンドはない。
■ このスレッドは過去ログ倉庫に格納されています