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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/05/25(水) 06:36:28ID:PVpWgcdf
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0303nobodyさん2005/06/10(金) 12:01:26ID:???
>>229
cgi-lib.pl使った時のデフォじゃね?
ttp://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/free?page=cgi-lib.pl
0304nobodyさん2005/06/10(金) 12:04:13ID:???
どうでもいいけど、 <label><input /></label> のが気持ちがいいよ。
03052992005/06/10(金) 12:06:16ID:n3jB9OmG
ありがとうございます
ページを読みましたが$inはなかったです。
03062992005/06/10(金) 12:12:11ID:n3jB9OmG
cgi-lib.plの中に%inという連想配列があるからなのですね!
ありがとうございます。
早速cgi-lib.plをみてみます。
0307nobodyさん2005/06/10(金) 12:26:18ID:???
あぼーん
03083022005/06/10(金) 12:29:51ID:???
>304
私もそう思うけど

<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
なら、とりあえず

%labels =('1','<label for="yes1">はい</label>');
$co->radio_group(
           -name=>'yes',
           -values=>['1','2'],
           -labels=>\%labels);

で、いけるんで・・・。
これもむちゃくちゃ使いにくいけど。(・・`)
0309nobodyさん2005/06/11(土) 01:51:46ID:KxmWI2vs
質問です。

配列の中から文字列を検索して、
その文字列が含まれている配列の添え字を取得することはできますか?

例えば、
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";

みたいな配列@dataがあって、そのなかから"72歳"という文字が
含まれている配列の添え字(この場合だと1)を取得したいのですがどうすればよいでしょうか?
0310nobodyさん2005/06/11(土) 02:23:38ID:???
use strict;
my @data;
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my $str = "72歳";
for ( 0..$#data ) {
 if ( $data[$_] =~ /$str/ ) { print; }
}
__END__
0311nobodyさん2005/06/11(土) 02:46:40ID:???
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my$str = "72歳";
for(0..$#data){
print $_ if [split(/<>/,$data[$_])]->[1] =~ /$str/;
}
0312nobodyさん2005/06/11(土) 03:03:41ID:???
print map { $_->[0] } grep { (split /<>/, $_->[1])[1] =~ m/$str/ } map { [$_, $data[$_]] } 0 ..$#data;
0313nobodyさん2005/06/11(土) 03:03:43ID:???
@index = grep m/72sai$/, 0..$#data;
03143132005/06/11(土) 03:05:12ID:???
index そのままマッチテストした。だめだね。
03153122005/06/11(土) 03:06:40ID:???
>>313
オマイので気付いた('A`)
print grep { (split /<>/, $data[$_])[1] =~ m/$str/ } 0 ..$#data;
0316nobodyさん2005/06/11(土) 09:07:57ID:???
質問させていただきます。
変数名を変数で扱うことができますでしょうか?
分かりにくいので例を示しますと、

$TEST = "test";
$OUTPUT = "[[[TEST]]]";
$OUTPUT =~ s/\[\[\[(.*)\]\]\]/$$1/g;
print "$OUTPUT";

↑これで、”test”という出力がほしいのですが… 
3行目のコーディングはWindows版のActiveperlでは動くのですがLinux版ではエラーになってしまいます。(もともと、あんなコードで動くことが予想外なんですが。)

よろしくお願いします。
03173092005/06/11(土) 10:20:03ID:???
>>310-315
できました。ありがとうございました。
0318nobodyさん2005/06/11(土) 10:58:39ID:???
>>316
それであってるはずだがsymbolic referenceを使うことに
なるのでstrict refsな時は問題がでるかもしれん。

というかエラーになるというのならエラーメッセージぐらい
示せよ...
0319nobodyさん2005/06/11(土) 12:06:49ID:???
以前サーバのルートディレクトリじゃないディレクトリに大きなファイルをアップロードしたのですが、
そのファイルをほしいと言う人がいるので、その人にファイルを与えようと思っています。
しかし、そのファイルを再びダウンロードしてアップロードするとすれば 1 日ぐらいかかってしまいますので、
CGI からそのファイルにリンクしようと思っています。

しかし、 perl 初心者なので、自分が作ったプログラムをサーバ上で実行していいかわかりません。
どうか、以下のプログラムは大丈夫か確認していただけないでしょうか。

#!/usr/bin/perl

&output;

sub output {
   open(IN,"(ここにファイルパス)");
   print "Content-type: application/x-zip-compressed\n\n";
   binmode(IN);
   binmode(STDOUT);
   print <IN>;
   close(IN);

   exit;
}
0320nobodyさん2005/06/11(土) 12:11:42ID:???
なんでCGIで出力しなきゃならんの?w
迷惑だからやめれ。
そのファイルへのリンク貼るか教えるだけでいいじゃん。
0321nobodyさん2005/06/11(土) 12:16:11ID:???
シンボリックリンクしろ。
03223292005/06/11(土) 12:16:57ID:???
>>320
ご指摘ありがとうございます。
素直にルートディレクトリにアップロードします。

ご迷惑をおかけしました。
03233192005/06/11(土) 12:18:04ID:???
>>321

あ、その方法がありました。
ありがとうございます。
0324質問2005/06/11(土) 22:30:32ID:95WOJCIX
AというCGIでBというCGIファイルを作ろうとしています。
具体的には、Aのなかで、

open(HANDORU,">B.cgi");

print HANDORU << "END";
#!c:\perl\bin\perl
print $data;
END

close(HANDORU);

とした場合、B.cgiはつくられるのですが、
その内容で、\(円マーク)が消えており、、また$dataがなくなってしまいます。
¥を¥にしたらそのまま「¥」にされて書き込まれたりします。
どうしたら、うまく¥や変数が記述されるのでしょうか?
0325質問2005/06/11(土) 22:36:20ID:95WOJCIX
訂正です。。
¥を&yen;にしたらそのまま「&yen;」にされて書き込まれたりします。


0326nobodyさん2005/06/11(土) 23:01:48ID:???
>>325
ttp://www.rfs.jp/sitebuilder/perl/02/02.html#5.エスケープシーケンス
0327質問>解決2005/06/11(土) 23:12:39ID:???
>>326
ありがとうございました!
0328nobodyさん2005/06/12(日) 00:07:30ID:???
CGI.pm の中に

if -d $_ && -w _;

って式があるんだけど、これは

if -d $_ && -w $_;

の略、ってことでよいの? つーか 略せるんだったの・・? 見たことなかったんだけど
0329nobodyさん2005/06/12(日) 01:09:06ID:???
>>328
perlfunc - Perl builtin functions
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item__i__X__i__FILEHANDLE

>どのファイルテスト (あるいは、stat や lstat) 演算子にも、下線だけから成る特別なファイルハンドルを与えると、
>前回のファイルテスト (や stat) の stat 構造体が使われ、システムコールを省きます
0330nobodyさん2005/06/12(日) 01:21:50ID:Eqf0BMjV
今オブジェクト指向でモジュールを組んでいるのですが質問いいでしょうか?
プライベートメソッド内で俗に言うthisを使い処理をする場合、
thisはプライベートメソッドを使用しているメソッドからそのメソッドに引数として渡して処理しなければならないのでしょうか?
どなたかご教授して頂けると嬉しいです。
0331nobodyさん2005/06/12(日) 01:45:45ID:???
>>329 そこにあったか!
あーサンクス!! いいこと知ったー
0332nobodyさん2005/06/12(日) 03:55:40ID:???
>>330
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlobj.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlbot.html
http://perl.infoware.ne.jp/documents/perlboot.ja.html
03333302005/06/12(日) 20:39:01ID:Eqf0BMjV
>>332
すみません、一通り見てみたのですが何処に答えがあるか分かりませんでしたorz
見落としていたらごめんなさい。
プライベートメソッドがオブジェクトのリファレンスを取得するには、
やはり実際に呼び出されたメソッドから引数でリファレンスを渡してやらないと行けないのでしょうか?
0334nobodyさん2005/06/12(日) 20:51:17ID:???
そもそもperlにプライベートメソッドなどないわけだが...
なにをさしているかわからない以上はマニュアル嫁的な
一般論以上の回答のしようもないんじゃないかと。

perlの場合オブジェクト指向といっても$foo->f(...)の
形で呼べばfが$fooをblessしたときのパッケージから
探されるのと、自動的に$fooがサブルーチンfの最初の
引数になるぐらいの単純な仕掛けだから難しく考えても
しょうがないと思われる。

03353302005/06/12(日) 21:18:28ID:Eqf0BMjV
>>334
説明下手ですみません。。たぶん、用語等ちゃんと理解できてないんだと思いますorz
プログラムからあるクラスのメソッドを呼び出すとき第一引数にオブジェクトのリファレンスが渡されますよね、

#sub new { $this = shift; ←これ

そのリファレンスをそのクラス内でしか使えない(使わない)メソッド

#sub _cool { ←慣例的に_で始まるサブルーチン名を付けられ、そのクラス内のメソッドから呼び出すので、
#第一引数にはオブジェクトのリファレンスが渡されないメソッド

で使いたいのですが、

#$this->{hoge} ←こんな風に

引数としてリファレンスを渡すしか方法はないのでしょうか(もっと綺麗な方法はないのでしょうか)?
03363302005/06/12(日) 21:19:41ID:???
"#$this->{hoge} ←こんな風に" → "#$this->{hoge} ←こんな風に使いたい。"です。すみません。
0337nobodyさん2005/06/12(日) 21:25:29ID:???
>>335
頭に_をつけたなんてのは人間が勝手に目印にしてるだけで
perlは何の特別扱いもしてくれない。頭が_じゃないのと
全く同じ。
0338nobodyさん2005/06/12(日) 21:33:38ID:???
もうちょっと読んでやれよ
0339nobodyさん2005/06/12(日) 21:59:12ID:???
マニュアル嫁
0340nobodyさん2005/06/12(日) 22:46:08ID:???
>>330
$this->_cool();
これではいやだと言っているのか?
03413302005/06/12(日) 23:15:22ID:???
>>340
仕組みを理解してませんでした。orzありがとうございます〜。
0342nobodyさん2005/06/12(日) 23:59:58ID:???
$you->houkei
0343nobodyさん2005/06/13(月) 03:11:14ID:???
$i->muketruyo->kaseidakedona;
0344nobodyさん2005/06/13(月) 17:16:05ID:???
encodingモジュールはどういうときに使いますか?
Jcode.pmのような使い方をするときは、Encodeだけで間に合うと思うのですが。。
0345nobodyさん2005/06/13(月) 19:18:16ID:???
JIS漢字が含まれている文字列のタグを取り除こうと
$str =~ s/>/>/g;
$str =~ s/</</g;
とやったら、「小」とか「松」って文字が文字化け
するようになったのだけど、どうやったら対処できそう?
0346nobodyさん2005/06/13(月) 19:20:38ID:???
あ、元に戻された。全角で書くと
$str =~ s/>/&gt;/g;
$str =~ s/</&lt;/g;
な感じ。
0347nobodyさん2005/06/13(月) 19:44:01ID:???
>>346
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
0348nobodyさん2005/06/13(月) 20:04:41ID:???
つまり、 jcode なんとかを
突っ込んで EUC に変換して、
タグを変換して JIS に変換し直すって
ことかな?だりぃな。
0349nobodyさん2005/06/13(月) 20:17:48ID:???
つーかソースをeucで書けよ。

それにブラウザによっては違う文字コード送ってくる場合もあるから、
どちらにしろ文字コードのチェックは必要だ。
0350nobodyさん2005/06/13(月) 20:24:45ID:???
ソースはEUCにしたところで、何も変わらない。
ファイルと出力がJISなんだよ。
頭の柔らかい奴は、JISのタグ変換ぐらい、
もっとスマートな方法でやると思ったんだがな。
0351nobodyさん2005/06/13(月) 20:27:26ID:???
>>350
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
http://search.cpan.org/~dankogai/Encode-2.10/lib/Encode/Supported.pod
0352nobodyさん2005/06/13(月) 21:10:29ID:???
>>350
アホだな
0353nobodyさん2005/06/13(月) 22:42:36ID:???
>>350
いまどきSJISじゃなくてJISだなんて・・・。 メール以外に使うときあったのか。
0354nobodyさん2005/06/13(月) 23:29:19ID:???
大手企業のサイトをいくつか見ればわかるが
意外と JIS 指定のところが多い
依存性の関係もあるのだろうが
SJIS とか EUC に拘っている奴は
場数が少ない人だと思う

といっても、 JIS に未来はないけどな
0355nobodyさん2005/06/13(月) 23:37:35ID:???
例えば何処か教えて頂けると嬉しい。
知ってる企業をいくつか検索してもJISで構築されているサイトが見つからない。。。
0356nobodyさん2005/06/13(月) 23:57:27ID:???
>>354
おまいが一番拘ってるように見えるがw

つーか、マンドクセだからeuc使ってるだけで。
普通に使う分には一番コスト低いと思うが。eucにデメリットある?
0357nobodyさん2005/06/14(火) 00:26:50ID:???
aho
0358nobodyさん2005/06/14(火) 00:31:27ID:???
Web ページだと、文字コード自動判別するとき、
EUC-JP と Shift_JIS は誤判定されることが多いけど、
ISO-2022-JP だと割と誤判定されにくい、ってのはあるかも。
0359nobodyさん2005/06/14(火) 00:38:52ID:???
>>356
結構ある。 > http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
その点ユニコならこういう問題は起きない。 でもサイズが増えるのがデメリット。
0360nobodyさん2005/06/14(火) 00:40:32ID:???
>>358 自動判別とかw 黙って Content-Type くらい書こうぜー
0361nobodyさん2005/06/14(火) 01:06:25ID:???
>>360
ローカルの HTML ファイルを開こうとしたら Content-Type なんてないわけですが
0362nobodyさん2005/06/14(火) 01:24:46ID:???
ローカルファイルを直接開くときはさすがに無理だが
Apache なら AddCharset しておくのが正しい姿だろうな
0363nobodyさん2005/06/14(火) 01:34:09ID:???
>>345
たぶんこれでできるから

foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
if($str=~/^[^\x1B]/){
$str =~ s/&/&/g;
$str =~ s/</</g;
$str =~ s/>/>/g;
$str =~ s/"/"/g;
}
$out .= $str;
}
0364nobodyさん2005/06/14(火) 01:34:48ID:???
>>361
metaでいい
0365nobodyさん2005/06/14(火) 01:36:56ID:???
>>363
すまん、間違い。

foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){

は

foreach my $str($in =~ /(\x1B.*?\x1B..)|([^\x1B]+)/g){

ね。
0366nobodyさん2005/06/14(火) 12:33:58ID:TLKadJIJ
初歩的な質問かもしれませんが、

$text[$ii] = "<tr><td>上の段</td></tr>\n";
$text[$ii] =. "<tr><td>下の段</td></tr>\n";

と書き
$text[$ii]に"<tr><td>上の段</td></tr>\n<tr><td>下の段</td></tr>\n"が格納されるように、
コーディングしたつもりなのですが、エラーが発生してしまいます。
$text[$ii]に"<tr><td>上の段</td></tr>\n"に後から追加で"<tr><td>下の段</td></tr>\n"が、
格納されるようにするにはどのように変えたらよいですか?
0367nobodyさん2005/06/14(火) 12:38:42ID:???
×=.
○.=
0368nobodyさん2005/06/14(火) 12:48:08ID:TLKadJIJ
ありが�d!
0369 ◆sMFKtEQF46 2005/06/14(火) 17:39:32ID:???
$text の中には下のような配列になっています。
成田 船橋 , 八王子 町田 立川 国分寺 , 所沢 川越 秩父


これを最終的に下のような二次元配列にするために
kanto[0][0] = "成田"
kanto[0][1] = "船橋"
kanto[1][0] = "八王子"
・・・
kanto[1][3] = "秩父"


下のようなプログラム文を書いたのですが、

for $ii (0..$#text) {
 @kanto1 = split /,/,$text[$ii];# ←ここはうまくいく
 foreach $kk (@kanto1) {
  @kanto[$kk][] = split / /,$kanto1[$kk];# ←ここでエラー
 }
}

@kanto[$kk][]のところでエラーになってしまいます。
どのようにしたら、うまく@kantoに二次元配列を作成することが出来るでしょうか
0370nobodyさん2005/06/14(火) 18:03:21ID:???
とりあえず
foreach $kk (@kanto1) じゃなくて foreach $kk (0 . $#kanto1) だろ。
0371nobodyさん2005/06/14(火) 18:10:58ID:???
>>369
@kanto = map { [split / /] } split /,/, $text;
0372nobodyさん2005/06/14(火) 18:28:00ID:???
369の書き方でなら
@{$kanto[$kk]} = split / /,$kanto1[$kk];
0373 ◆sMFKtEQF46 2005/06/14(火) 18:44:58ID:???
>>370-371
ありがとうございました!
0374nobodyさん2005/06/14(火) 19:17:35ID:yq1owU75
UDPSocketを使って、

「Clientから何らかのパケットが届く"たび"に何らかの処理」
を行いたいのですが、recvイベントのようなものはキャッチできないでしょうか。
0375nobodyさん2005/06/14(火) 19:50:50ID:???
単純な質問で申し訳ないのですが

@hogehoge[][];
$len = scalar(@hogehoge);
print "要素数= $len ";

この時の$lenに格納されているものは何でしょうか?

$len = scalar(@hogehoge[1]);

最初の[]の要素数を調べるにはどのようにしたら良いのでしょうか?
0376nobodyさん2005/06/14(火) 20:00:55ID:???
すいません、投稿しなおしです。

単純な質問で申し訳ないのですが

@hogehoge[][];
$len = scalar(@hogehoge);
print "要素数= $len ";

この時の$lenに格納されているものは何でしょうか?


@hogehogeの最初の[]の要素数を調べるには、どのような関数を使ったら良いのでしょうか?


0377nobodyさん2005/06/14(火) 20:33:05ID:???
>最初の[]の要素数
意味不明
0378nobodyさん2005/06/14(火) 21:20:23ID:???
もちょっと "リファレンス" というのを勉強したらいいと思うぞ。
高次元配列っていうのも、単にリファレンスのネスト、と解釈すれば結構容易に理解できる。
0379nobodyさん2005/06/15(水) 01:53:31ID:???
open (TEST, 'hoge.txt');
my $fg = \*TEST;

こんなことをしたとき、

close ($fg); でも

my $fh = *{$fg}{IO};
close ($fh); でも

どっちでもできるんだけど、どっちがいい、とか、どっちかが支障がでる、とかあるのかな?
とりあえず stat (〜) は上で言えば $fg でしかできなかったんだけども。
0380nobodyさん2005/06/15(水) 03:40:50ID:???
>>379
引数にグロブ(グロブのリファレンス)を受け取るPerlのネイティブ関数には
ファイルハンドルのリファレンスを渡しても無理だから上の方がいいかと。

ただ、下のは、ブロック内でグロブをローカル化すればシンボルに依存しない
ファイルハンドルのリファレンスが得られる。

でも、シンボルに依存しないファイルハンドルが欲しければ

open ($fh, 'hoge.txt');

てやれば 、無名のグロブリファレンスが得られるから、こっちがいいかもよ。
0381nobodyさん2005/06/15(水) 09:23:19ID:???
>>379
それ@niftyだとできないんだよね。。
なので全部eval使ってる。

my $id = "FILE";
eval 'open(' . $id . ', "+>>$path$file")'
〜
eval "seek($id, 0, 2)";
eval "truncate($id, 0);seek($id, 0, 0)";
〜
eval 'print ' . $id . ' $tmp';
〜
eval '@tmp = <' . $id . '>';
〜
eval "close($id)";
0382nobodyさん2005/06/15(水) 10:05:30ID:???
>>381
単にstrict refsなだけなんじゃ?

Can't use string ("FILE") as a symbol ref while "strict refs" in use at 〜

ってなエラーじゃない?

わざわざ$idに"FILE"なんて入れないで380の言うように空のまま(=undef)に
しとけば、openするときに無名のリファレンスを入れてもらえるので問題ない
と思うが。
0383nobodyさん2005/06/15(水) 10:24:44ID:???
えと、一応ファイル扱う為の汎用パッケージのつもりで作った中身です<<381
pfile::open(FILE, writemode)
read(FILE)
write(FILE)
close(FILE)
見たいな感じで、同時に複数開けるように作りました。


あと、@niftyはエラーlogは見れないようになってるらしくて、
内容は分からないんです。。
どっかで配布してた、エラー内容返すcgiも走らないので…

use strict(綴り適当)も、宣言しただけでエラーが出ます。
@niftyは特殊らしい。。でも鯖を選ばず動くscript書きたいので。。

@niftyでエラーメッセージを見る方法ってあるんでしょうか?
誰か使ってる方いましたらご教授お願いします。
0384nobodyさん2005/06/15(水) 10:41:24ID:???
>>383
特定環境の話をここで続けていいものかわからんが、@nifty は
プラグマも含めて全てのモジュールが故意に削除されている。
use strict; すると strict.pm が見つからないのでコケる。

別にモジュール「が」使えないわけではないので、必要な
モジュール一式を任意のディレクトリに入れて、スクリプトの
頭で BEGIN { push @INC, '/your/lib/dir' } すれば動く。
0385nobodyさん2005/06/15(水) 11:03:08ID:???
>>384
全部消すとは…CGI利用可能にしてるくせに、珍しいですよね。。

@niftyは負荷に対するチェック基準?も厳しいらしく、
自分で作ったfilelockのテストも(n回読み込み→書き込みを繰り返すスクリプトを2つ同時に走らせる)、
nを100回で指定して走らせたら鯖でタイムアウトになりました。
isWebだと300でも軽快に動いたんですが。(それ以上は迷惑になるっぽいので試してません)

確かにちとスレ違いっぽいので以後控えますね。
色々情報ありがとうございました!
0386nobodyさん2005/06/15(水) 11:21:53ID:pMiUaalZ
とあるPerlの参考書にこういうコードがありました。

$file_name = "./text.txt"
open(HANDLE, "$file_name");

ファイルオープンの行の第二引数にダブルクォーテーションがついてるんですが、これは何故なんでしょうか?
これがなくても大丈夫みたいですが。。
0387nobodyさん2005/06/15(水) 11:31:50ID:???
「"」 = 変数を解釈し、展開する。文字列は文字列として解釈する。
「'」 = 全て文字列として解釈する。

my $a = 10;

print "ねむいよー$a";
 →ねむいよー10

print 'かたがいたい$a';
 →かたがいたい$a
0388nobodyさん2005/06/15(水) 11:38:55ID:???
>>387
引用符の違いではなく、変数だけのときにわざわざ二重引用符をつける意味を聞いているのだが
my $a = 10;

print "$a";

print $a;
0389nobodyさん2005/06/15(水) 11:44:11ID:EGr0DnSI
# パスワード
$pass = '○○○○';

# パスワード確認
if ($in{'pass'} eq "$pass") {
print"パスワードが合ってます";
}
else {
print"パスワードが違います";
}

パスワード認証なら上記でも良いのではないでしょうか?
複雑にする必要性ありそうなのだけど教えてください。
0390nobodyさん2005/06/15(水) 12:13:11ID:???
>>389
KENTとかそうやってるね
ソース見られたときにパスワードがモロばれだけどね
普通はDESとかMD5で暗号化する
03913862005/06/15(水) 12:38:11ID:???
>>388
そうなんです。
そっちがわからないんですが・・・。
まあどっちでも動くみたいなんで今のところ気にしないことにしますね^^
失礼しました。
0392nobodyさん2005/06/15(水) 12:47:04ID:???
>>391
明示的に宣言したり、デフォルトの読み書き方法で無いときは"がいるから使い回してるだけじゃない?
0393nobodyさん2005/06/15(水) 12:59:31ID:???
>>392
どゆいみ?
03943892005/06/15(水) 13:32:19ID:EGr0DnSI
>>390
早々有難うございます。
暗号化するというのは、こんな事をするのでしょうか?

my @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');

$in{pwd} = crypt($in{pass}, $SALT[int(rand(64))] . $SALT[int(rand(64))]);
0395nobodyさん2005/06/15(水) 13:56:02ID:???
なんでキーを rand するんだろ?
そのままじゃ暗号化されたパスの先頭にキーがついたままだから、substrとかしないと意味ないし、
取ったら取ったで、キーがわからないとどうやってパスワードチェックしたらいいのかわかんねくね?
0396nobodyさん2005/06/15(水) 14:18:53ID:???
>>380
>>379だけど、サンクス!参考になった。
今回はシンボルの文字列自体に意味があるので、グロブにさせてもらうよ。

そういや nifty も知らんけど、まだ perl-5.005 以前を使ってる鯖ってあるのかな?
AAA! が 5.005 だったが。 ってスレ違いか。
とにかくなるべく新しいのにして欲しいな。 いろいろ動かなくて困るw
0397nobodyさん2005/06/15(水) 14:29:05ID:???
>>395
パスワードの暗号化ってのはパスワードをプレーンテキストで
保管せず、暗号化したデータを保管するってこと。

登録時には下記$pwdをサーバに保存。
$pwd = crypt($input_pwd, $salt);

認証時には保存された$pwdでチェック。
if (crypt($input_pwd, $pwd) eq $pwd) { # 認証OK
0398nobodyさん2005/06/15(水) 15:20:04ID:???
>>397
それはわかるけど、 >>395 でさ、>>397で言う $salt を rand させる意味はなくね? って話。

暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、
rand させようがさせまいが、 $pwd を見られたら $salt わかるわけじゃん?

だったら $salt は rand させても、最初から"xy"とかに固定してても、そんなに変わらない気がするのだよ。
0399nobodyさん2005/06/15(水) 15:24:17ID:???
>>397
横レスだけど、それってチェック時はなにやってるの?

登録時には下記@indb_pwd($pwd及び$salt)をサーバに保存。
@indb_pwd = (crypt($input_pwd, $salt), $salt);

認証時には保存された$saltを使用して、$pwdでチェック。
if ($indb_pwd[0] eq crypt($in{pwd}, $indbpwd[1])) { # 認証OK

これだったら意味分かるけど…。
0400nobodyさん2005/06/15(水) 15:25:45ID:???
ああああ

>>397-398
>暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、

知らなかった…
失礼しましたorz
0401nobodyさん2005/06/15(水) 15:57:46ID:???
でもどっかの誰かさんのスクリプトはrandしてるね。
0402nobodyさん2005/06/15(水) 16:01:20ID:???
誰誰?
0403nobodyさん2005/06/15(水) 16:08:10ID:???
>>382
遅レスですが、なんか勘違いしてたかも。
@niftyだと>>379のような、「ファイルハンドルを変数に入れる」ということ自体が出来ないんです。
多分perlのバージョンのせいだと思うんですが。

んでしょうがないので、ハンドルをあらわす文字列自体を動的に扱う為にevalを使ってるという感じです。
$id = "FILE"というのはファイルハンドルを変数に入れようとしているわけではなく、展開してevalに渡すためです。
■ このスレッドは過去ログ倉庫に格納されています