Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0388nobodyさん
2005/06/15(水) 11:38:55ID:???引用符の違いではなく、変数だけのときにわざわざ二重引用符をつける意味を聞いているのだが
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:???KENTとかそうやってるね
ソース見られたときにパスワードがモロばれだけどね
普通はDESとかMD5で暗号化する
0391386
2005/06/15(水) 12:38:11ID:???そうなんです。
そっちがわからないんですが・・・。
まあどっちでも動くみたいなんで今のところ気にしないことにしますね^^
失礼しました。
0394389
2005/06/15(水) 13:32:19ID:EGr0DnSI早々有難うございます。
暗号化するというのは、こんな事をするのでしょうか?
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:???そのままじゃ暗号化されたパスの先頭にキーがついたままだから、substrとかしないと意味ないし、
取ったら取ったで、キーがわからないとどうやってパスワードチェックしたらいいのかわかんねくね?
0396nobodyさん
2005/06/15(水) 14:18:53ID:???>>379だけど、サンクス!参考になった。
今回はシンボルの文字列自体に意味があるので、グロブにさせてもらうよ。
そういや nifty も知らんけど、まだ perl-5.005 以前を使ってる鯖ってあるのかな?
AAA! が 5.005 だったが。 ってスレ違いか。
とにかくなるべく新しいのにして欲しいな。 いろいろ動かなくて困るw
0397nobodyさん
2005/06/15(水) 14:29:05ID:???パスワードの暗号化ってのはパスワードをプレーンテキストで
保管せず、暗号化したデータを保管するってこと。
登録時には下記$pwdをサーバに保存。
$pwd = crypt($input_pwd, $salt);
認証時には保存された$pwdでチェック。
if (crypt($input_pwd, $pwd) eq $pwd) { # 認証OK
0398nobodyさん
2005/06/15(水) 15:20:04ID:???それはわかるけど、 >>395 でさ、>>397で言う $salt を rand させる意味はなくね? って話。
暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、
rand させようがさせまいが、 $pwd を見られたら $salt わかるわけじゃん?
だったら $salt は rand させても、最初から"xy"とかに固定してても、そんなに変わらない気がするのだよ。
0399nobodyさん
2005/06/15(水) 15:24:17ID:???横レスだけど、それってチェック時はなにやってるの?
登録時には下記@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:???0402nobodyさん
2005/06/15(水) 16:01:20ID:???0403nobodyさん
2005/06/15(水) 16:08:10ID:???遅レスですが、なんか勘違いしてたかも。
@niftyだと>>379のような、「ファイルハンドルを変数に入れる」ということ自体が出来ないんです。
多分perlのバージョンのせいだと思うんですが。
んでしょうがないので、ハンドルをあらわす文字列自体を動的に扱う為にevalを使ってるという感じです。
$id = "FILE"というのはファイルハンドルを変数に入れようとしているわけではなく、展開してevalに渡すためです。
0409389
2005/06/15(水) 17:31:01ID:EGr0DnSI有難うございます。
意味わかりました。
>>401
randがついてるので、rand関数により暗号化してるのかと思ったのです。
0410nobodyさん
2005/06/15(水) 17:43:51ID:???crypt() のやってることは厳密には「暗号化」ではないからね。
などと言って混乱させてみるテスト。
0411nobodyさん
2005/06/15(水) 17:44:40ID:???文字列がかぶらないようにするため
0412411
2005/06/15(水) 17:49:12ID:???0413nobodyさん
2005/06/15(水) 17:59:40ID:???それはちょっと無理があるようなw
aaaaaaってパスワードがたくさん登録されれば 1/4096でかぶるわけだし、
そもそもパスワードがかぶっても普通は問題ないし。
0414nobodyさん
2005/06/15(水) 18:05:59ID:???それは 4096個 salt があった場合の話だがな。
違う salt の pwd が2個なら2倍かかる、ってだけ。
0416nobodyさん
2005/06/15(水) 18:24:04ID:???$p = 'password';
($s) = ('∀');
$c = crypt $p, $s;
とかやればコード中に顔文字が出てきて和めるぞ。
0417nobodyさん
2005/06/15(水) 18:25:58ID:???0418nobodyさん
2005/06/15(水) 18:28:26ID:???0419nobodyさん
2005/06/15(水) 18:41:12ID:???v 5.00503 の AAA!cafe だと
× my $fh = undef; open ($fh, '>test.txt');
○ my $fh = \*FILE; open ($fh, '>test.txt');
試しに↓のコードで動かしてみ
#!/usr/bin/perl -w
use strict;
local *FILE;
my $fh = \*FILE;
if ($fh) {
open ($fh, '>test.txt'); print {$fh} 'hogehoge'; close ($fh);
}
print "Content-type: text/html\n\nOK? // $$fh // $fh";exit;
0421nobodyさん
2005/06/15(水) 18:59:46ID:???ちなみに、最近のモダンな crypt() は、 salt の文字種によって、
暗号化の方式 (ていうかハッシュ関数) を切り替えてくれちゃったりするので、
あんまりへんてこりんな文字列を salt に許すと portable じゃなくなったりする罠。
0422考えて半年
2005/06/15(水) 19:50:20ID:biXgIpFaていうか、Perlでチャットとか掲示板とか、画像をうpするとか機能を追加した
ゼロからプログラミング作れるようになるには、どうすればよいのでしょう?
10日で覚える、とほほ、独習、リャマ本、らくだ本、リファレンスなど
よんでも、いまだに初心者です。漏れがbakaなの?
0423nobodyさん
2005/06/15(水) 20:04:08ID:???つーか、このスレのタイトルを変える相談かと思ったw
半年もかじれば、シンプルなカウンターや掲示板くらいならできない?
本を閉じて、試しに作ってみればいい。 分からないときに本を見る。
参考書が一冊もなくても、ネットのあちこちで転がってるし、
生半可な本より充分な内容の perl.doc もある。
とにかく、芸術分野みたいなもんで 「自分で造る」 「自分で調べる」 のが大切。
・・・なんてな。
0424nobodyさん
2005/06/15(水) 20:12:28ID:???凡人プログラマなら、とにかくいっぱい作りまくって練習するしかないかと。
0425nobodyさん
2005/06/15(水) 20:25:54ID:???0426考えて半年
2005/06/15(水) 20:26:41ID:biXgIpFaforeach $lines (@lines) {
($tm,$cnt,$scnt,$ip) = split(/<>/, $lines);
if($ipc==2){&get_;if($cook){ $flag=2; last;}}
if($date eq "$tm") {
if($ipc==1){if ($addr eq "$ip") { $flag=2; last; }}
$flag=1;
$cnt++;
$scnt++;
$lines = "$tm<>$cnt<>$scnt<>$addr<>\n";
}
foreach { から } までを繰り返すコードであることは理解できる。
しかし、{ } の中身が理解できない。
だから、どうしてよいのかわからない。
0428考えて半年
2005/06/15(水) 20:32:45ID:biXgIpFa0429nobodyさん
2005/06/15(水) 20:33:03ID:???0430nobodyさん
2005/06/15(水) 20:37:40ID:???混乱しちゃって、今は何を言われてもポカーンじゃないかな。こんな感じ。
@ @
△
0431nobodyさん
2005/06/15(水) 20:38:07ID:qXBtGg7k空のデータがある時のやり方がどうしても出来ません。
埼玉,東京,群馬
大阪,,奈良
空のデータがある場合はcolspanを使い↓のように連結させる
<table>
<tr><td>埼玉</td><td>東京</td><td>群馬</td></tr>
<tr><td colspan=2>大阪</td><td>奈良</td></tr>
</table>
このようにするにはどうしたらよろしいすか?
サンプル等をご存知でしたら教えていただければ助かります。
0432nobodyさん
2005/06/15(水) 20:40:19ID:???先に普通にテーブル作ってから
<td>([^<]+)</td><td></td>を
<td colspan=2>$1</td>に置き換えるとか
0433nobodyさん
2005/06/15(水) 21:43:22ID:???最初がカンマの場合は全部一番後ろに押し付けてみた。
while (<DATA>) {
chomp;
my $data = $_;
$data =~ s/^(,+)//;
$data .= ',' x (1+length $1);
my @pref = split /,+/, $data;
my @count;
while ($data =~ s/(,+)//) {
push @count, length $1;
}
print qq{<tr>};
my $n = 0;
foreach my $span (@count) {
print $span > 1 ?
qq{<td colspan="$span">$pref[$n]</td>}:
qq{<td>$pref[$n]</td>};
$n++;
}
print qq{</tr>\n};
}
0434nobodyさん
2005/06/15(水) 23:46:03ID:???以下で問題なく動きました…orz
ありがとうございます。
>>9のページではハンドルのリファレンスじゃなくてグロブそのものを入れようとしてるんですが、
そちらだと出来ませんでした。。
#!/usr/local/bin/perl -w
local *FILE;
my $fh = \*FILE;
if ($fh) {
#? エラー
#? エラー
open ($fh, '>./data/test.txt');
print {$fh} 'hogehoge';
close ($fh);
}
print "Content-type: text/html\n\nOK? // $$fh // $fh";exit;
0436nobodyさん
2005/06/16(木) 00:15:51ID:???全体として何をやってるか理解するのは難しいのもあると
思うよ。
このコード結局なにがやりたいんだよみたいな(笑)
0437nobodyさん
2005/06/16(木) 00:43:45ID:???いろいろと難しいかもしれんですな
0438nobodyさん
2005/06/16(木) 01:07:20ID:???SMART はわかりやすいんだけど、ちょっとね。
まあ 5.005のファイルハンドルなら、↓読めば結構理解いいかも。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca
0440nobodyさん
2005/06/17(金) 00:42:38ID:FGf+BXABアルゴリズムって何ですか?perlの文法わかるのに、掲示板とかチャット
とかプログラム作成しようと思うとイマイチ、わかりません。
どうすればよいの?アルゴリズムがわからないから、プログラム作成でき
ないのでしょうか?
0441nobodyさん
2005/06/17(金) 00:48:21ID:???既にあるものを参考にしない事(詰まったときにヒントとしてみるのはあり)ってルール作って。
hallo world表示
↓
フォームの入力内容表示
↓
ファイルの内容を読み込んで表示
↓
フォームの内容をファイルに書き込み
↓
カウンタの作成
↓
一行掲示板の作成
↓
eコマースサイトの作成
0442nobodyさん
2005/06/17(金) 00:55:30ID:FGf+BXAB#! c:\perl\bin\perl
print "Hello Perl\n";
0443nobodyさん
2005/06/17(金) 00:56:02ID:???0444nobodyさん
2005/06/17(金) 01:00:22ID:FGf+BXAB#! c:\perl\bin\perl
print "Enter Word : ";
$word = <STDIN>;
chomp($word);
print "$word\n";
0445nobodyさん
2005/06/17(金) 01:00:53ID:???0447nobodyさん
2005/06/17(金) 01:15:33ID:???#!perl
でも動くことを知った(ActivePerl)
0448nobodyさん
2005/06/17(金) 01:21:15ID:???0449nobodyさん
2005/06/17(金) 01:25:54ID:FGf+BXAB0450nobodyさん
2005/06/17(金) 01:31:45ID:???0451nobodyさん
2005/06/17(金) 01:37:28ID:???わからないポイントが明確になって良かったじゃないか。
html周りって事なら
ttp://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_kj01.htm
とか見てみれば?
0452nobodyさん
2005/06/17(金) 01:41:58ID:???0453nobodyさん
2005/06/17(金) 01:44:09ID:???0454nobodyさん
2005/06/17(金) 02:08:23ID:???%in=map{s/\+/ /g;s/%([\da-fA-F]{2})/chr hex$1/eg;$_}map{split/=/,$_,2}split/&/,$ENV{QUERY_STRING};
print<<HTML;
Content-Type: text/html
<form action=$ENV{SCRIPT_NAME}><textarea name=text rows=20 cols=40>$in{text}</textarea>
<input type=submit></form><hr>
HTML
eval$in{text},$@&&print"<pre>$@</pre>";
0455nobodyさん
2005/06/17(金) 02:48:58ID:???0456nobodyさん
2005/06/17(金) 02:53:14ID:???0457nobodyさん
2005/06/17(金) 07:32:45ID:???もし自分でコードを書くとしたら、テンポラリなハッシュにforeachでキーと値をいちいちぶち込むことになるんでしょうか。
0458nobodyさん
2005/06/17(金) 07:56:09ID:???%y = (%x , %y);
↑の書き方じゃ不満?
my %x = qw(a 1 b 2 c 3 d 4 e 5 f 6 g 7);
my %y = qw(e 01 f 02 g 03 h 04 i 05 j 06 k 07);
print join (', ', map { $_ .'=>'. $x{$_} } sort keys %x), "\n";
print join (', ', map { $_ .'=>'. $y{$_} } sort keys %y), "\n";
%y = (%x , %y);
print join (', ', map { $_ .'=>'. $y{$_} } sort keys %y), "\n";
0459nobodyさん
2005/06/17(金) 08:30:05ID:???0460nobodyさん
2005/06/17(金) 08:46:08ID:???0461nobodyさん
2005/06/17(金) 11:14:38ID:???keys, values, eachはハッシュを変更しない間は同じ順番になることが
保証されている。keysのマニュアルなど参照。
あと、ハッシュをリストコンテキストで評価したときに返るリストも
同じ順番になりそうなもんだが、そういう記述は見つけられなかった。
これはどうなんすかね?
0462nobodyさん
2005/06/17(金) 11:57:39ID:???0463nobodyさん
2005/06/17(金) 12:14:45ID:???0464nobodyさん
2005/06/17(金) 12:17:27ID:???重複するキーの値をどうするか?という問題の希ガス。
%xに%y入れるか、%yに%x入れるか。
0465nobodyさん
2005/06/17(金) 14:45:47ID:???それとも重複したら Array にしたい、とかかねえ。
0466質問
2005/06/18(土) 16:37:14ID:DZNl0XpA自分が作ろうと思っているのは、
ラジオボタンを使ったクイズ、チェックボックスを使ったクイズ、テキストボックスを使ったクイズ
なんですが、
気をつけることなどんなことでしょうか?
自分の考え(素人レベルですが・・)では、ラジオボタンとチェックボックスのほうは問題ないと思うのですが、
テキスト形式は不正な文字や引数を使われるとやばいとおもうので、正規表現でチェックするぐらいしか思いつきません.
0469nobodyさん
2005/06/19(日) 10:05:28ID:a/QQeV38$/ = "a";
chomp($data);
とすると$dataの行末のaを取り除くことができるみたいですが
aとbというような他の文字であっても取り除くようにすることはできませんかね?
PHPでいう$data = rtrim($data, "ab");みたいなことをやりたいんですが。
$/ = "ab";
chomp($data);
ではできませんでした。
0470nobodyさん
2005/06/19(日) 10:16:41ID:???$data =~ s/[ab]\z//;
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html
0471nobodyさん
2005/06/19(日) 14:29:18ID:???0472nobodyさん
2005/06/19(日) 23:01:48ID:???pingの結果はどうやって得るのですか?
0473nobodyさん
2005/06/20(月) 00:43:18ID:9D61R1Akしたいのですが、うまくいきません。
if ($str =~ /[\xA1-\xFE][\xA1-\xFE]/) {
}
これですと全角全てを許容してしまいますので、何か良い方法が
ございましたらご教示いただきたい次第です。
何卒、宜しくお願いいたします。
0474nobodyさん
2005/06/20(月) 01:08:33ID:???文字コード表は検索すれば出てくるよん。
0475nobodyさん
2005/06/20(月) 01:27:43ID:???0476nobodyさん
2005/06/20(月) 01:30:53ID:???0477nobodyさん
2005/06/20(月) 01:45:43ID:???で何とかなるかと思いましたが。うまく動いてくれませんでした。
皆様、色々とご教示有難うございました。
0478nobodyさん
2005/06/20(月) 01:52:50ID:???http://search.cpan.org/~bbb/Net-Ping-2.31/
0480nobodyさん
2005/06/20(月) 04:43:55ID:???アドバイス有難うございます。
EUCで全て書いて最後にSJISにしてページを出力しているため、
化けてしまうようです。この方法は諦めました。。
文字コードの範囲と言うものが少しわかってきたのですが、まだ
まだ勉強不足なので調べまくっているところです。
貴重なアドバイス有難うございました。
0481nobodyさん
2005/06/20(月) 13:21:42ID:???アバウトだけど叩き台くらいにはなるかしら。
/\A([\xA4\xA5][\xA0-\xFF]|\xA1\xBC)+\z/
0482nobodyさん
2005/06/20(月) 16:36:58ID:???+漢字も含む文字以外を許容しないというものなん
ですね。
この場合は
if ($str !~ /^([\xA1-\xFE][\xA1-\xFE])+$/) {
}
これで問題ないのでしょうか?
0483nobodyさん
2005/06/20(月) 17:47:52ID:/wReIU3Iperlでcgiを作成しているのですが
URLでhoge.cgi?day=20050620
と指定しているのに
--------------------------------
use CGI;
my $cgi = new CGI;
my $gDay = $cgi->param('day');
--------------------------------
というように取得できません、、、
Ctrl+F5で更新すると取れるのですが
なんでなのでしょう?
何か情報をお持ちな方はお教え頂けますとありがたいです。
0484nobodyさん
2005/06/20(月) 18:47:08ID:???0485nobodyさん
2005/06/20(月) 19:04:03ID:???ありがとうございますっ
url_paramというのがあったのですね、、
不勉強でした。
どうもですっ
0487482
2005/06/20(月) 21:33:18ID:???ぐぐりまくってなんとかここまでたどりつきました。
先生方、見てくださると大変助かります。
$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;
$hiragana = '\xA4[\xA1-\xF3]'; # ぁ〜ん
$katakana = '\xA5[\xA1-\xF6]'; # ァ〜ヶ
$kanji = '[\xB0-\xFE][\xA1-\xFE]'; # 漢字(実際に割り当てのない領域も有るが問題はない)
$nobashi = '\xA1[\xBC\xBD\xC1]'; # ー−〜
if($name !~ m/^$eucpre(?:$hiragana|$katakana|$kanji|$nobashi)+$eucpost$/){}
0488nobodyさん
2005/06/20(月) 22:07:25ID:???・・・にしては最後のアスキーは何なのかわからんか・・・。
全角記号とかはどうなるのかな。
まあ、やりたいことをもちょっと詳しく。 例とかだしてくれるとわかりやすいかも。
■ このスレッドは過去ログ倉庫に格納されています