Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0362nobodyさん
2005/06/14(火) 01:24:46ID:???Apache なら AddCharset しておくのが正しい姿だろうな
0363nobodyさん
2005/06/14(火) 01:34:09ID:???たぶんこれでできるから
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;
}
0365nobodyさん
2005/06/14(火) 01:36:56ID:???すまん、間違い。
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成田 船橋 , 八王子 町田 立川 国分寺 , 所沢 川越 秩父
これを最終的に下のような二次元配列にするために
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) だろ。
0372nobodyさん
2005/06/14(火) 18:28:00ID:???@{$kanto[$kk]} = split / /,$kanto1[$kk];
ありがとうございました!
0374nobodyさん
2005/06/14(火) 19:17:35ID:yq1owU75「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:???my $fg = \*TEST;
こんなことをしたとき、
close ($fg); でも
my $fh = *{$fg}{IO};
close ($fh); でも
どっちでもできるんだけど、どっちがいい、とか、どっちかが支障がでる、とかあるのかな?
とりあえず stat (〜) は上で言えば $fg でしかできなかったんだけども。
0380nobodyさん
2005/06/15(水) 03:40:50ID:???引数にグロブ(グロブのリファレンス)を受け取るPerlのネイティブ関数には
ファイルハンドルのリファレンスを渡しても無理だから上の方がいいかと。
ただ、下のは、ブロック内でグロブをローカル化すればシンボルに依存しない
ファイルハンドルのリファレンスが得られる。
でも、シンボルに依存しないファイルハンドルが欲しければ
open ($fh, 'hoge.txt');
てやれば 、無名のグロブリファレンスが得られるから、こっちがいいかもよ。
0381nobodyさん
2005/06/15(水) 09:23:19ID:???それ@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:???単に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:???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:???特定環境の話をここで続けていいものかわからんが、@nifty は
プラグマも含めて全てのモジュールが故意に削除されている。
use strict; すると strict.pm が見つからないのでコケる。
別にモジュール「が」使えないわけではないので、必要な
モジュール一式を任意のディレクトリに入れて、スクリプトの
頭で BEGIN { push @INC, '/your/lib/dir' } すれば動く。
0385nobodyさん
2005/06/15(水) 11:03:08ID:???全部消すとは…CGI利用可能にしてるくせに、珍しいですよね。。
@niftyは負荷に対するチェック基準?も厳しいらしく、
自分で作ったfilelockのテストも(n回読み込み→書き込みを繰り返すスクリプトを2つ同時に走らせる)、
nを100回で指定して走らせたら鯖でタイムアウトになりました。
isWebだと300でも軽快に動いたんですが。(それ以上は迷惑になるっぽいので試してません)
確かにちとスレ違いっぽいので以後控えますね。
色々情報ありがとうございました!
0386nobodyさん
2005/06/15(水) 11:21:53ID:pMiUaalZ$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:???引用符の違いではなく、変数だけのときにわざわざ二重引用符をつける意味を聞いているのだが
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のマニュアルなど参照。
あと、ハッシュをリストコンテキストで評価したときに返るリストも
同じ順番になりそうなもんだが、そういう記述は見つけられなかった。
これはどうなんすかね?
■ このスレッドは過去ログ倉庫に格納されています