Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0337nobodyさん
2005/06/12(日) 21:25:29ID:???頭に_をつけたなんてのは人間が勝手に目印にしてるだけで
perlは何の特別扱いもしてくれない。頭が_じゃないのと
全く同じ。
0338nobodyさん
2005/06/12(日) 21:33:38ID:???0339nobodyさん
2005/06/12(日) 21:59:12ID:???0342nobodyさん
2005/06/12(日) 23:59:58ID:???0343nobodyさん
2005/06/13(月) 03:11:14ID:???0344nobodyさん
2005/06/13(月) 17:16:05ID:???Jcode.pmのような使い方をするときは、Encodeだけで間に合うと思うのですが。。
0345nobodyさん
2005/06/13(月) 19:18:16ID:???$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:???Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
0348nobodyさん
2005/06/13(月) 20:04:41ID:???突っ込んで EUC に変換して、
タグを変換して JIS に変換し直すって
ことかな?だりぃな。
0349nobodyさん
2005/06/13(月) 20:17:48ID:???それにブラウザによっては違う文字コード送ってくる場合もあるから、
どちらにしろ文字コードのチェックは必要だ。
0350nobodyさん
2005/06/13(月) 20:24:45ID:???ファイルと出力がJISなんだよ。
頭の柔らかい奴は、JISのタグ変換ぐらい、
もっとスマートな方法でやると思ったんだがな。
0351nobodyさん
2005/06/13(月) 20:27:26ID:???http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
http://search.cpan.org/~dankogai/Encode-2.10/lib/Encode/Supported.pod
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:???おまいが一番拘ってるように見えるがw
つーか、マンドクセだからeuc使ってるだけで。
普通に使う分には一番コスト低いと思うが。eucにデメリットある?
0357nobodyさん
2005/06/14(火) 00:26:50ID:???0358nobodyさん
2005/06/14(火) 00:31:27ID:???EUC-JP と Shift_JIS は誤判定されることが多いけど、
ISO-2022-JP だと割と誤判定されにくい、ってのはあるかも。
0359nobodyさん
2005/06/14(火) 00:38:52ID:???結構ある。 > http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
その点ユニコならこういう問題は起きない。 でもサイズが増えるのがデメリット。
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:???全体として何をやってるか理解するのは難しいのもあると
思うよ。
このコード結局なにがやりたいんだよみたいな(笑)
■ このスレッドは過去ログ倉庫に格納されています