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

Perlコーディング初心者質問スレ Part 50

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/06/26(月) 00:46:38ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0010nobodyさん2006/06/26(月) 01:02:34ID:???
>>1
乙つつつ
0011nobodyさん2006/06/26(月) 10:30:20ID:???
>>11

おちかれー
0012nobodyさん2006/06/26(月) 20:55:18ID:???
1000取っちゃった。
オブジェクト指向より、いい指向ってないのかな。

大き目のプログラム組んで何ヶ月か、又は何年か後に見てみたら
全体の流れとそれぞれの処理を理解するのに数日かかってしまうのがいや。
これはオブジェクト指向とは無関係だけど。

プログラムを専門にやってないから思い出すのとあわせて、いつも
「なんでこんなイケてないんだこれ」
と自己嫌悪に陥る。

オブジェクト指向ってモジュールとか確かにべんりだけどさ。
完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
うんざりする。

もっといいやりかたないのかね。

うんスレ違いだ。すみませんでした。
0013nobodyさん2006/06/26(月) 21:30:04ID:???
>>12
それはプログラムの組み方の問題なんじゃないのかなあ。

プログラム組むときって、ノートに処理の流れとかメモするでしょ?
テキストエディタとかで
編集
 |- 検索
    |- 次を検索
    |- 前を検索
とかってあるけど、これもオブジェクト指向といえばオブジェクト指向だし。
編集::検索->次() みたいな。

これで例えば 「次を置換」 とか改造して入れるために、また一からプログラム全体を把握し直さなきゃわかんない、とかそーないと思うんだけど。
なんか変なとこにこだわりすぎてんじゃない?
0014nobodyさん2006/06/26(月) 21:48:52ID:???
>>12
> 完ぺき主義というか極端な自分としては全てをオブジェクト指向的にやろうとして、
> うんざりする。
> もっといいやりかたないのかね。

Ruby 使っとけ。
0015nobodyさん2006/06/26(月) 22:04:56ID:???
質問。
sub noward {
local($flag);
foreach ( split(/\s+/, $no_wd1) ) {
if (index("$in{'name'} $in{'sub'} $in{'comment'}",$_) >= 0) {
$flag = 1; last;
}
}
if ($flag) { $err .= "不適切な文字が含まれています。"; }
if ($err) { &error($err); }
}
禁止ワードのサブルーチンなんだけどコレを改行で区切る事が出来ないのだがどうすればいいのか教えてほしい。
お願いします。
0016nobodyさん2006/06/26(月) 22:19:27ID:???
その前に、何を改行で区切りたいのでしょうか?そこが分かりません。
文からするとサブルーチンを改行で区切りたいように読めるけど…。
0017nobodyさん2006/06/26(月) 23:07:40ID:???
kentっぽい書き方だな
0018nobodyさん2006/06/26(月) 23:26:42ID:???
いまどきmyですむようなところにlocalだしな。

悪い癖をおぼえる前にもう少しましな手本を探したほうがいいような
気がする。

0019nobodyさん2006/06/26(月) 23:38:21ID:???
kentはそろそろ後方互換性じゃなくて
古くてアレなスクリプトを配布する事による弊害を気にした方がいいね。
いまどきperl4だけの鯖なんてないし。
0020nobodyさん2006/06/27(火) 00:04:59ID:???
当方C/C++/VBは使えますがPerlは難しいですか?
以前使っていたレンタル鯖がCのCGIを許可していたので
Cでゴリゴリ書いていましたが、別の業者に移管されてしまい
そこの業者はCのCGIが不可、Telnet不可とCGIが全て使えなくなってしまいました。
昔、ちょろっとPerlの本を見たことがあるのですが、コードがC以上に記号ばかりでゴチャっとしていて
追いにくいなぁと直ぐに本を閉じてしまった記憶があります。
C12年/C++3年/VB5年程です。。
 
0021nobodyさん2006/06/27(火) 00:10:32ID:???
そんだけコード書いてればPerl覚えるのは余裕。
独特の癖があるので人のコードを読むのは苦労するかもしれんが、
書く分には好きなように書ける。

TIMTOWDIバンザイ
0022nobodyさん2006/06/27(火) 01:00:12ID:???
それだけの経験があるなら1週間perlだけ弄ってればすぐに動くものが作れるt思います。たぶん。

sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、
あまりに自由すぎるのがperlの欠点といったとこでしょか
0023nobodyさん2006/06/27(火) 01:15:43ID:???
とりあえず文字列操作は正規表現メインで。
Cのポインタの概念は無いんで、文字列ポインタ動かしたりはできません。
だからといって文字列は配列でもないので、配列操作にもしないことです。

Cだけの人がとりあえず書いてみたPerlのプログラム読んだ事あるけど
思いっきりCぽくて、全然Perlじゃなかったなあ。

ていうか、Perlのソース読む方が理解が早いかも。
0024nobodyさん2006/06/27(火) 01:38:26ID:???
まず変数の扱いとスコープの違いにつまづいて
次に構文の違い(elsifとかswitchとか)につまづいて
コンテキストの理解につまづいて
関数の仮引数が無いのにつまづいて
リファレンスをポインタだと思い込んでつまづいて

・・・がんばってください。
0025nobodyさん2006/06/27(火) 02:08:24ID:ms3DPBt4
掲示板のプログラムを作っているのですが、
まず、書き込みページを出力して、
データを受け取って文法チェックをして 結果を出力して、
次のデータ受け取りでファイルに書き出しをするプログラムなのですけど、
どうしても原因が見つけれないエラーが出ていて困っています。
ただ、これ自体が大きすぎるので少し違うルートで質問します。

500 Internal Server Error
というのはどのような条件下で出てくるのでしょうか?
細かい説明などをくれるとうれしいです。

それともうひとつ
プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
ファイル書き込み等をしているどこかでエラーが出てくる場合
どういうミスの可能性があるでしょうか?

ずいぶんと分かりにくくなってしまっていますが、お願いします
0026nobodyさん2006/06/27(火) 02:36:42ID:???
よくこういう質問でるけど、なんで自分でわかんないんだろう?
文法ミスならローカルで実行したときわかるし、
違うなら処理の途中でためしに exit して、どこまでならエラーでないか、って突き詰めていけばわかるよな?

それでもどこもエラーないなら、
print "Content-type: text/html\n\n"; の前に何か print してる、くらいしか思いつかない。

>>25
要するに、知らんがな、ってこと。
ブラウザだけでやってんの? ちゃんとエラー文のせようよ。
0027nobodyさん2006/06/27(火) 02:52:04ID:???
>>25
> ただ、これ自体が大きすぎるので少し違うルートで質問します。

お勧めしません。逆効果です。


> 500 Internal Server Error
> というのはどのような条件下で出てくるのでしょうか?

それが、CGI が何なのかを理解せずに書いたプログラムなら、ほとんどどのような条件下ででも。


> ファイル書き込み等をしているどこかでエラーが出てくる場合
> どういうミスの可能性があるでしょうか?

あらゆるミスの可能性、及び誰のミスでもない可能性があります。
どういうミスかはわかりません。ただ、「誰のミスか」であれば、この場合は控え目に言って 99.8% 程度の確立であなたのミスです。

# 助けてあげたくてもこの質問じゃ何もできないよぅ・・・orz
0028nobodyさん2006/06/27(火) 03:53:29ID:H9M/RMpI
#! c:/perl/bin/perl

# CGIヘッダーの出力
print "Content-type: text/html\n\n";

# HTMLの出力
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";
print "<html>\n";
print "<head><title>Hello HTML</title></head>\n";
print "<body><p>こんにちは。これはHTML文書の例です。</p></body>\n";
print "</html>";

というCGIのプログラムがあったんですが
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n";はどういう役割をしているんでしょうか??
0029nobodyさん2006/06/27(火) 04:05:08ID:???
HTMLのDOCTYPE宣言。ValidなHTML文書作る時の常識。Perlとは直接関係ない。
板違いなのでWeb制作技術板へ行ってらっしゃい。
0030nobodyさん2006/06/27(火) 04:09:20ID:???
> sub内でローカル宣言した変数がリファレンス(Cでいうポインタ)で参照できちゃう気持ち悪い部分もあってw、

何それ?
0031nobodyさん2006/06/27(火) 04:13:07ID:???
>>30
こういう事かな。レキシカルな $s が外から見える。

sub hoge {
my $s = "ababababa";
return \$s;
}

my $s_ref = hoge();
print $$s_ref;
0032nobodyさん2006/06/27(火) 04:54:57ID:???
それなかったらオブジェクトやクロージャもできないなあw
0033nobodyさん2006/06/27(火) 06:30:44ID:???
>>25
基本的にCGIのエラーは500しか出ません。
パーミッションのミスでも文法ミスでも全て500が出ます。

>プログラムやルーチンの文法ミスもないし、ファイルの参照ミスもないのに
>ファイル書き込み等をしているどこかでエラーが出てくる場合
>どういうミスの可能性があるでしょうか?
例えば代入式の途中でexit()で終了した場合なんかは
perlがエラー→何も出力されない→500となったりします。
(が、たぶんそのエラーじゃ無い気がしますが・・・

要するに一度にいっぺんに書きすぎて、デバッグできなくなった状況ですよね。
=c
=cut
という技があるのでそれで半分づつエラーの範囲を絞ってみてはどうでしょうか?
(それ以前に全部コメントアウトしprint "\n\n"だけ書いて動くのかとかも要確認。
それが動けばそこから少しずつ増やしていけば何でエラーが起きてるのか特定できるはず・・・
0034nobodyさん2006/06/27(火) 08:42:29ID:???
>>25
perl -c の結果をうpしてよ。
0035nobodyさん2006/06/27(火) 08:46:11ID:???
>32
static宣言見たいのがあればなぁ・・・と思うわけですよ
0036nobodyさん2006/06/27(火) 09:41:13ID:???
>>35
そこで Tie::Static ですよ。
0037nobodyさん2006/06/27(火) 14:12:21ID:XmLciTUK
1: 自分はこういう事がしたい。
・ファイルがなければ新規にファイルを作成し$dataAを書き込んでから$dataBを書き込む。
・ファイルがあれば(すでに$dataAは書き込み済みなので)$dataBを書き込む。

2: それでこんな風にやってみたが・・・
unless ( -e $file ) {
open ( OUT , "> $file" ) or die;
flock ( OUT , 2 );
seek ( OUT , 0 , 0 );
print OUT $dateA;
truncate ( OUT, tell ( OUT ) );
close ( OUT );
}

open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );

3: こんなエラーが出て上手く行かなかった。
エラーは出てないんですが、これって同時アクセスがあった場合に
ファイル壊れる可能性ないですか?
他に良い方法があればアドバイスよろしくお願いします。
0038nobodyさん2006/06/27(火) 14:45:28ID:???
>>37
他にもある気がするが、-eしてから>でopenまでの間に割り込まれると壊れるな。
File::Tempで一時ファイルを作ってリネームするとよさげ。
0039372006/06/27(火) 15:20:15ID:???
>>38
やっぱり壊れる可能性ありますよね。

>File::Tempで一時ファイルを作ってリネームするとよさげ。
ありがとうございます。
一度それでやってみます。

他にもアドバイスがあればよろしくお願いします。
0040nobodyさん2006/06/27(火) 15:28:09ID:???
ひとつロック用のファイルを用意しといて

・ロック用ファイルをロック
・ファイル存在チェック
・無ければ生成
・オープン
・処理
・書き込み
・ロック用ファイル閉じ

モジュール使わずコレでどうでしょう
0041372006/06/27(火) 15:47:13ID:???
>>40
アドバイスありがとうございます。

一連の流れを全てロックしてしまえ、ということですね。
ただ、ロックファイル自体が信用できるかどうか怪しい代物なので
ちょっと二の足を踏んでしまいます。
0042nobodyさん2006/06/27(火) 15:55:10ID:cuOoVNQc
HTML内のフォームからファイルと時間を選択させて、
その時間になったら自動で指定ファイルをFTPで別サーバー
へ移動するという処理は可能でしょうか?
Perlでcrontabに書き出すことができればと思いましたが
レンタルサーバーでそれは許可されておりません。

cronを使用せずにperlにより指定時間になっているかどうかを
チェックして時間になっていたらFTPでファイルを移動
するような処理は可能なのでしょうか?

どなたかご存知の方居られましたら宜しくお願い致します。
0043nobodyさん2006/06/27(火) 15:57:12ID:???
http://pc8.2ch.net/test/read.cgi/php/1024795138/
こっち行ったほうがいいかな。
0044nobodyさんNGNG
もうcron関連の質問秋田
0045372006/06/27(火) 16:32:46ID:???
>>40
勘違いしてました。
flockでロックファイルをロックすれば良いだけでしたね。
ロックファイルが残り続けるのがちょっと気持ち悪いですが簡単に処理できるのは良いですね。

>>43
誘導先見ましたが、どちらかと言うとロックの追究が主のようで、例えば
open ( OUT , "+< $file" ) or die;
flock ( OUT , 2 );
いろいろ処理
seek ( OUT , 0 , 0 );
print OUT $dateB;
truncate ( OUT , tell ( OUT ) );
close ( OUT );
このコードのロック自体の有効性についての議論が中心のように見受けました。
わざわざ紹介していただいたのに不躾な言い分ですが、
私は上のようなロックでまず大丈夫という前提に立っているので
誘導先のスレよりもこちらで質問した方が適切だと思いますので
すみませんが、こちらに居させて下さい。
0046nobodyさん2006/06/27(火) 16:38:21ID:???
>もうcron関連の質問秋田
そうおっしゃらずにどうかお願いします。
過去ログ見てみても無かったので…
0047nobodyさん2006/06/27(火) 17:35:31ID:???
過去ログに何度も出てると思うよ。
cron使いたくない(or 知らない)けど定時的に何かしたいってのは。
0048nobodyさん2006/06/27(火) 17:36:54ID:???
>>37
はじめの書き出しの方のseekとtruncateは別に無くても良いと思う
0049nobodyさん2006/06/27(火) 18:26:33ID:???
ファイルをダウンロードした後、サーバ上から自動で消すことって不可能?
Locationでダウンロードするファイルに飛ばした後に
unlinkしてもダウンロードが始まる前にファイルが消えちゃう。
0050nobodyさん2006/06/27(火) 18:29:53ID:???
ダウンロードがきちんとできたかどうか分からないけど
失敗してても消すのならできそう。
0051nobodyさん2006/06/27(火) 18:34:47ID:???
>>49
そこでcronですよ。
削除リストファイルを作ってそこにあるファイルは定期的に起動するcgiで削除する。

で、ファイルのダウンロードはcgiから以外にはできないようにしておく。
一度ダウンロードしたものは2度とできないようにしておく。
0052nobodyさん2006/06/27(火) 18:35:11ID:???
>>50
是非ご教示下さい!
0053nobodyさん2006/06/27(火) 18:40:24ID:???
定期的に削除でいいのか??
Content-type: application/octet-streamで検索
0054492006/06/27(火) 18:49:19ID:???
>>51
やっぱりcronかぁ。
ダウンロード自体の頻度はかなり低い(月に数回程度)ので
すごく無駄な気がしてしまふ・・・。

>ファイルのダウンロードはcgiから以外にはできないようにしておく。
そんなことってできるんスか!?
refererでチェック?でも、簡単に偽装できるから意味ないか。

>一度ダウンロードしたものは2度とできないようにしておく。
これもやり方がさっぱり思い付かない。
パーミッション変更?
でも、いつダウンロードが終了したかは確認できんよな。
これもcron?って、それならパーミッションいじるより削除した方が早いよな。

>>53
ダウンロード頻度が低い、つまり削除の頻度も低いので
定期的に削除というよりは都度削除希望であります。
でも、無理なら仕方ない、といった感じであります。
検索して調べてきます。サンクス!
0055nobodyさん2006/06/27(火) 19:06:41ID:???
そんなに頻度が多くないなら、Location使わずにCGI経由でダウンロードさせるようにすれば?
つまり、CGIがファイルを読み出して出力、全部出力したらファイル削除。

素のファイルには .htaccess などでアクセスできないように設定しておく。
0056nobodyさん2006/06/27(火) 20:19:59ID:???
55の言ってるので出来ますね
print "content-type:MIME-type\n\n";
open fp,"downfile";
print <fp>;
close fp;
unlink "downfile";
ただしMIME typeをちゃんと指定しないと、textで無理やり表示されたり、めんどくさい感じ・・・
あと、ダウンロード→キャンセルでもうファイルが消えてるので、結構使いづらいかも?
.htaccess使うまでもなくパーミッションを600とかにしとけば普通に見えない。

ところで、UPは誰がどういう風にするのかが気になる・・・
それによってはもっといいアイデアがあるかも??
0057nobodyさん2006/06/27(火) 20:42:38ID:???
いや、だから、>>53 が言ったみたいに
Content-Type: application/octet-stream

Content-Type: application/x-download
とでもしてDLさせればいいんでない?
0058492006/06/27(火) 21:36:29ID:???
Content-Type: application/octet-stream
とか初見だったんで最初はよく分からんかったけど。

ファイル読み込み

出力

ファイル削除

で出来ますた!サンクスであります。

>>56
それとほぼ同じ形に収まった・・・2時間以上かけてだけどw
UPは特定の仲間内(?)の任意の誰か、
またはすでにあるログから情報を抽出加工したものを新規ファイルとして作成、
という何とも分かりにくい感じ。深く気にしないでね。

ところで、少し気になったんだけど、
>>53>>55>>56>>57
の言おうとしてる内容はほぼ同じって解釈で合ってるよね??
0059nobodyさん2006/06/27(火) 21:54:28ID:???
合ってる合ってる
0060562006/06/27(火) 22:01:59ID:???
>>57
なるほど、そういうmimeタイプがあるんですね。知らなかったです。
nameを指定するオプションとかも使えそうな感じ・・・(?
0061492006/06/27(火) 22:38:41ID:???
本題とちょっとズレるけど、
open直後にunlinkしても内容は保持されるみたいだね。
てか、UNIXなんかのテンポラリファイル使う場合は常套手段だとか。
>>56の例で言えば、
open fp,"downfile";
unlink "downfile";
print <fp>;
close fp;
って感じだな。
こうした方が、異常終了の際にファイルが消えてないってリスクが減るのでベターなわけだ。
0062nobodyさん2006/06/28(水) 00:23:47ID:???
>>61
お前ぶっとばすよ?
0063nobodyさん2006/06/28(水) 00:32:55ID:???
>>62
やめて
0064252006/06/28(水) 00:51:27ID:Ty2xiiJR
perl -c ではOKでエラーは見つからないです。
localでは、問題が見つからなかったのでサーバにアップロードしたらエラーが出まして
自分が考えれるところを確認しましたが、分からなくなってます。

ttp://hisazin-up.dyndns.org/up/src/11946.txt
再びいろいろといじっているせいで若干おかしなものも混ざっているかもしれませんが、
このような形です。
何の引継ぎなどがない場合には78行目の処理が行われて、
別ルーチンから投稿フォームが出力されます。
その投稿フォームから出力された場合に85行目からの処理が実行されて、問題がなければ
投稿OKかどうかの確認ページの出力
その確認ページからデータを引き継いだら143行目の処理に入るのですが、
143行目の処理の中で
ローカルでは問題なく結果が表示されるのですが、
サーバへアップするとどうしても500エラーとなってしまいます
0065nobodyさん2006/06/28(水) 01:54:52ID:???
こりゃまたけったいなスクリプトがきたぞ
0066nobodyさん2006/06/28(水) 02:00:58ID:???
0067nobodyさん2006/06/28(水) 02:05:10ID:???
500エラーのときは鯖のエラーログ出せよ。

どうせヘッダ出力してないとかそういうのだろうけどな。
0068nobodyさん2006/06/28(水) 02:58:08ID:???
sub nothing_log{
nothing_log: <<<これは一体?
print "その記事はすでに削除されているので書き込みできません\n";
exit;
}
0069nobodyさん2006/06/28(水) 03:28:54ID:???
>>68
ラベル。
0070nobodyさん2006/06/28(水) 03:45:51ID:???
>>25
まず、require文とhtml_head("掲示板")だけで動くのか報告よろ。
どうせ晒すなら全部晒してもらうとこっちでもテストできるんだけど・・・
0071nobodyさん2006/06/28(水) 03:58:15ID:???
あ、わかった。143行目を print "\n\ntest\n"; で解決ですね。たぶん
あるいは html_head("掲示板"); print "test\n"; とか
82行目のifをスルーした場合どこにもヘッダを出力する
ルーチンがないので、普通にエラー・・・・・・・・・・・・
0072nobodyさん2006/06/28(水) 04:19:30ID:???
・・・
form_vew_make($pop_name,$pop_title,$pop_msg,$pop_icon,$pop_color,$pop_password,$pop_mail,$pop_home,$pop_thread);
こういう代入はあまりにも毒々しいので、$popなんとかは全部1つのリファレンスにまとめた方がいい。
あるいは%FORMをそのまま放り込んで、$pop系の変数を全部捨てた方がいい。
$lenなんとかはlenごときで変数作るなよと、wその程度だったら
必要な時にlen_count($なんとか)で取れば十分。
あと$view_flagのgoとbackは、goとbackを代入してるif文のところで
そのまま処理すればよいので不要
0073nobodyさん2006/06/28(水) 08:40:19ID:???
すみません。
BASIC認証するときのサーバの負荷について教えてください。
[ID]:[PASS]
というようなユーザファイルあると思うんですが、
何件ぐらい大丈夫なんでしょうか。
5万、10万件ぐらいは平気な感じでしょうか。
データベースでなく、ただのテキストファイルの検索って
どれぐらい大変なのかわかりません。

レンタルサーバじゃ実験できないし、
apacheのインストールの勉強も途中という
初心者ですので。
よろしくお願いします。
0074nobodyさん2006/06/28(水) 09:22:51ID:???
>>73
perlの話じゃないので、スレ違い。使ってる鯖(apacheなり
なんなり)のスレを探してそっちできけ。
0075nobodyさん2006/06/28(水) 09:34:48ID:???
板違い
0076nobodyさん2006/06/28(水) 10:04:15ID:???
>>74
73です。
たしかに、1をよく読んだら全然違ってました。
初心者、perlつながりで質問してしまいました。

旅に出ます。><
0077nobodyさん2006/06/28(水) 17:08:53ID:???
どこがperl繋がりなんだ…
0078nobodyさん2006/06/28(水) 17:13:29ID:???
perlで.htaccessなり.htpasswdに追加アッー!
0079nobodyさん2006/06/28(水) 17:38:43ID:JW7kjnCG
質問があるんですが「->」って何に使うんですか?
検索エンジンでは記号の検索ができないので、調べようにも調べられずに困っています・・・。
0080nobodyさん2006/06/28(水) 17:43:27ID:???
>>79
「perl アロー演算子」辺りでぐぐる
0081nobodyさん2006/06/28(水) 20:12:24ID:xzEYpxD8
デリファレンス
0082nobodyさん2006/06/29(木) 00:16:50ID:???
$hoge->[10] $hoge は配列へのリファレンス
$hoge->{piyo} $hoge はハッシュへのリファレンス
$hoge->()    $hoge はコードブロックへのリファレンス
$hoge->piyo() $hoge はオブジェクト(メソッドコール)

っていう理解でいいですか?
0083nobodyさん2006/06/29(木) 00:18:42ID:???
まぁ合ってる。
ただリファレンスじゃなくて
リファレンスの参照というか、デリファレンスというか
0084822006/06/29(木) 00:33:58ID:???
$hoge->[10] で要素が参照できるなら $hoge は配列へのリファレンス、というわけではないのでしょうか?
デリファレンスしてるのはアロー演算子ですよね?? 混乱してきた。。。
0085nobodyさん2006/06/29(木) 00:37:48ID:???
ごめん、82を読み違えてた。
合ってる。$hogeは配列へのリファレンス。

0086nobodyさん2006/06/30(金) 00:52:51ID:???
掲示板で無造作な大量リンクのカキコを排除したいと考えています。

  if( $txt にURLが5個以含まれる ){

    はじき処理

  }

の場合は、IF文のカッコ内にどのような文字を入れるとよろしいでしょうか。
よろしくお願いします。
0087nobodyさん2006/06/30(金) 01:03:46ID:???
$text =~ m!(http://.*){5,}!s
とかでいいんじゃね
0088nobodyさん2006/06/30(金) 01:31:11ID:???
>>87
なりました11111111
ありがとうございました   三 三 旦
0089nobodyさん2006/06/30(金) 10:18:19ID:???
perl 5.8.6 で XML::RSS を使って Podcast 情報を取得しようとしていますが、enclosure url が引っ張り出せません。XML::RSS では出来ないようなのですが、他に enclosure url が取得できるものはあるでしょうか。m(_ _)m
0090nobodyさん2006/06/30(金) 10:41:50ID:???
crypt関数について質問です。
#saltはランダムです
$crypted_pass = crypt($password, $salt);

$crypted_passは、$password='1111';$saltはランダムなので毎回違った
文字列になります。すごい疑問なんですが、これをBASIC認証のための
.htpasswdファイルに書き込むと、'1111'でも$crypted_passは毎回違う
文字列ができるのに、何回$crypted_passを作ってもBASIC認証の
ダイアログに'1111'を入れると認証されます。
すごいバカなので全然理解できないです。

わかりにくいとあれですので、やってみたいことを細くします。
フォームから入力されるパスワードを$FORM{'pass'}
.htpasswdファイルにすでに書いてあるパスワードを$pass_htpasswdとします。

パスワードが正しかったら〜するって言うことが目的なんです。
if( crypt($FORM{'pass'}, $salt) eq $pass_htpasswd){hoge処理;}
こういうことがしたい場合は、$saltを固定しないとperlでは
できないんでしょうか?固定するとこの処理で大丈夫みたいです。
ランダムだと毎回違う文字列が出てきてだめです。

サーバだとなんで、'1111'ってわかるんでしょうか。
perlでもなんか処理のしかたありますか。
ちょっと、長い文章で申し訳ないですが、よろしくお願いします。
0091nobodyさんNGNG
ヒント:crypted文字列の前から二文字はsalt
0092nobodyさん2006/06/30(金) 12:01:59ID:???
>>91
cryptの戻り値(digest)にはsaltの情報も含まれているのであとで確認したいときは
それをsaltとしてそのまま食わせればいいことになっている。

When verifying an existing digest string you should use the digest as the salt (like
"crypt($plain, $digest) eq $digest"). The SALT used to create the digest is visible as part of
the digest. This ensures crypt() will hash the new string with the same salt as the digest.
This allows your code to work with the standard crypt and with more exotic implementations. In
other words, do not assume anything about the returned string itself, or how many bytes in the
digest matter.

0093nobodyさん2006/06/30(金) 15:14:17ID:???
>>91
>>92
90です。
ありがとうございます。
できました!!!

saltといっしょだったんですね。
cryptだとパスワードそのまま、saltにできるんですね。
すごく便利です。
ありがとうございました。
0094nobodyさん2006/06/30(金) 15:22:58ID:???
なんか勘違いしてそうな文面だな。
0095nobodyさん2006/06/30(金) 16:17:19ID:???
            第三者                  「通信は傍受される」のがセキュリティの前提で
             ↓
     受信     ↓傍受   送信          この場合、パスワードが傍受されるから
サーバー←←←[パスワード]←←←クライアント     生でパスワードを送るのはダメ


            第三者                 パスワードからハッシュ関数で生成した
              ↓                   ダイジェストを送信すれば、傍受されても
     受信      ↓傍受   送信          ダイジェストからパスワードは復元できない
サーバー←←←[ダイジェスト]←←←クライアント    (できるけど、とてつもなく時間がかかる)ので安全

ダイジェストを受け取ったサーバーは、自分が持っているパスワードをダイジェスト化して
それと送られてきたダイジェストを比べる事で、パスワードが合っているか判断する
っていう理解でおk?
0096nobodyさん2006/06/30(金) 16:20:58ID:???
>>95
それだと、「ダイジェスト」を「パスワード」と読み替えたのと全く同じなのでよくない。
0097nobodyさん2006/06/30(金) 16:38:41ID:???
下手な図だが。要はパスワードの平文をサーバに保存しないのがcryptの一般的な目的かと

 パスワード入力 ランダムなサルト
      ↓    ↓
crypt($password, $salt);
 ↓              登録時
保存(ダイジェスト化されたパスワード)
 ├──────┐    照合時
 ↓            │
照合           │頭にくっついているサルトだけが
 ↑            ↓    自動で取り出される。
crypt($password, $salt);
     ↑     パスワードとサルトが同じであれば
 パスワード入力     出てくるダイジェストが同じものになる
0098nobodyさん2006/06/30(金) 16:45:56ID:???
なるほど。ダイジェストだけ保存しておけば、認証はできるのかぁ。
セキュリティは難しいです>< 結城たんのアリス本でも読もうかな・・・
0099nobodyさん2006/06/30(金) 17:07:50ID:???
>>98
たん付けとは浩に失礼だ。
0100nobodyさん2006/06/30(金) 17:12:00ID:???
>>94
90です
if( crypt($FORM{'pass'}, $pass_htpasswd) eq $pass_htpasswd){hoge処理;}
$saltの文字列が長いときは、crypt関数が、
頭から2文字saltを取ってきてくれて、.htpasswdに記録されている
パスワードをそのまま$saltに入れても大丈夫

っていうことかと思ったのですが。
違いましたでしょうか?
スクリプトは正常に動いてるみたいです。

よくわかりませんが、BASIC認証は通信を暗号化
しないとだめなんですよね。
たしか。
0101nobodyさん2006/06/30(金) 17:18:35ID:???
>>100 勉強してきたようだな。
>>93
> saltといっしょだったんですね。
から>>100の意味は読み取れないぞ。
それに、書くなら、
crypt関数は$saltの先頭2文字をsaltとみなして計算するから、
とかするのが正しいだろう。

ロジックが重要なプログラムの世界で、言葉遣いぐらい、と思っているとひどい目に遭うぞ。
0102nobodyさんNGNG
ミルカさん萌え
0103nobodyさん2006/06/30(金) 17:50:56ID:???
正確には一概に頭二文字とはいえないな。ライブラリ依存。
POSIXやSUSv3の範囲で言えば確かにそうだけど、
拡張として$n$...$形式のsaltに対応している環境も結構ある。
ttp://www.gnu.org/software/libc/manual/html_node/crypt.html
ttp://www.freebsd.org/cgi/man.cgi?query=crypt&apropos=0&sektion=3&manpath=FreeBSD+6.1-RELEASE&format=html
0104nobodyさん2006/06/30(金) 18:21:42ID:u4Lu+yYC
メールアドレス:aaaa@aaaa.ne.kp
### メール投稿設定 ###
@$tmail = '';# 投稿用メールアドレス
A$mailhost = '';# 受信メールサーバー
B$mailid = '';       # メールアドレス(@以下は入れないでください)

って言うのがあったんだけどそれぞれ何入れればいいんですか?
一応番号ふっときました
0105nobodyさん2006/06/30(金) 18:27:54ID:???
>>104
Perlうんぬん以前の問題だな・・・

PC初心者板マジオススメ
http://pc7.2ch.net/pcqa/
0106nobodyさん2006/06/30(金) 18:28:48ID:???
>>104
ここはスクリプトを「作る人」のためのスレだ。使う人はスレ違い。
作者に聞け。
0107nobodyさん2006/06/30(金) 19:33:30ID:???
作者も聞かれても困るけどなw
0108nobodyさん2006/07/01(土) 00:20:37ID:???
@$tmail = 'info@yahoo.co.jp';# 投稿用メールアドレス
A$mailhost = 'pop.mail.yahoo.co.jp';# 受信メールサーバー
B$mailid = 'info';       # メールアドレス(@以下は入れないでください)
とでもやっておけばいいんじゃないの?
シラネ
0109nobodyさん2006/07/01(土) 15:05:13ID:???
ページ移動させたいときに

print "Location: http://google.com/";, "\n\n";

ってやるけど、windowsのローカル+Apache+ActivePerl だと 500エラー返しちゃうんだよね…
eval でもエラーにならないんで、
Location: ができるかどうかって前もって判断することってできる?
■ このスレッドは過去ログ倉庫に格納されています