Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0091nobodyさん
NGNG0092nobodyさん
2006/06/30(金) 12:01:59ID:???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:???>>92
90です。
ありがとうございます。
できました!!!
saltといっしょだったんですね。
cryptだとパスワードそのまま、saltにできるんですね。
すごく便利です。
ありがとうございました。
0094nobodyさん
2006/06/30(金) 15:22:58ID:???0095nobodyさん
2006/06/30(金) 16:17:19ID:???↓
受信 ↓傍受 送信 この場合、パスワードが傍受されるから
サーバー←←←[パスワード]←←←クライアント 生でパスワードを送るのはダメ
第三者 パスワードからハッシュ関数で生成した
↓ ダイジェストを送信すれば、傍受されても
受信 ↓傍受 送信 ダイジェストからパスワードは復元できない
サーバー←←←[ダイジェスト]←←←クライアント (できるけど、とてつもなく時間がかかる)ので安全
ダイジェストを受け取ったサーバーは、自分が持っているパスワードをダイジェスト化して
それと送られてきたダイジェストを比べる事で、パスワードが合っているか判断する
っていう理解でおk?
0097nobodyさん
2006/06/30(金) 16:38:41ID:???パスワード入力 ランダムなサルト
↓ ↓
crypt($password, $salt);
↓ 登録時
保存(ダイジェスト化されたパスワード)
├──────┐ 照合時
↓ │
照合 │頭にくっついているサルトだけが
↑ ↓ 自動で取り出される。
crypt($password, $salt);
↑ パスワードとサルトが同じであれば
パスワード入力 出てくるダイジェストが同じものになる
0098nobodyさん
2006/06/30(金) 16:45:56ID:???セキュリティは難しいです>< 結城たんのアリス本でも読もうかな・・・
0100nobodyさん
2006/06/30(金) 17:12:00ID:???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:???>>93の
> saltといっしょだったんですね。
から>>100の意味は読み取れないぞ。
それに、書くなら、
crypt関数は$saltの先頭2文字をsaltとみなして計算するから、
とかするのが正しいだろう。
ロジックが重要なプログラムの世界で、言葉遣いぐらい、と思っているとひどい目に遭うぞ。
0102nobodyさん
NGNG0103nobodyさん
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### メール投稿設定 ###
�@$tmail = '';# 投稿用メールアドレス
�A$mailhost = '';# 受信メールサーバー
�B$mailid = ''; # メールアドレス(@以下は入れないでください)
って言うのがあったんだけどそれぞれ何入れればいいんですか?
一応番号ふっときました
0105nobodyさん
2006/06/30(金) 18:27:54ID:???Perlうんぬん以前の問題だな・・・
PC初心者板マジオススメ
http://pc7.2ch.net/pcqa/
0107nobodyさん
2006/06/30(金) 19:33:30ID:???0108nobodyさん
2006/07/01(土) 00:20:37ID:???�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: ができるかどうかって前もって判断することってできる?
0110nobodyさん
NGNG0111nobodyさん
2006/07/01(土) 15:50:23ID:???マジでΣ
何かの設定違ってんのかなー。
>>109 なんで " になってんのかわかんないけど。
まあ、ぐぐったら tok2 とか infoseek とかでも Location は 500 るっぽいんだけど、
それは手動で設定変更して HTML吐いての meta タグで飛ばしてた。
プログラム内で自動で判断できれば一番なんだけど、何か対策ないかねえ。
0112nobodyさん
2006/07/01(土) 16:43:35ID:???も一緒に吐くとどうなる?
0113nobodyさん
2006/07/01(土) 16:44:34ID:???print "Status: 302 Shine Compact\n";
0115nobodyさん
2006/07/01(土) 18:23:44ID:???こいつを出してからにするとどう?
0116nobodyさん
2006/07/01(土) 18:52:35ID:???おおおおお(*゜▽゜)
print "HTTP/1.1 301 Moved Permanently\n";
〜
だといかなかったけど、参考にぐぐって、
print "Status: 301 Moved Permanently\n";
print "Content-type: text/html\n";
print "Location: http://google.com/\n\n";
こうしてやったらいきました! すごい! ありがとう!
……っていうか、ひょっとして Content-type: ないからあかんかった……?(;´Д`)
動くとこはなくても動いたんだけどw
0117nobodyさん
2006/07/01(土) 19:08:37ID:???>>115
それはnph-*なファイル名でないとあかんやん。
0119nobodyさん
2006/07/01(土) 19:13:14ID:R0VHYefT鯖のインストール済モジュールが知りたくて、検索してたら↓の情報がありました。
ttp://antipop.gs/mt/2004/11/21/115534
ただこれを実行すると DBI など複数同一表示されるものがあるのですが、
これを重複をなくすにはどうすれば良いでしょうか?
0120ヽ(´ー`)ノ ◆.ogCuANUcE
2006/07/01(土) 20:57:42ID:???0122nobodyさん
2006/07/01(土) 23:52:40ID:???小数点さえなければ
------------------------------------------------------
$cout = sprintf("%06d",$cout);
for($i = 0; $i < length($cout); $i++){
$no = substr($cnt,$i,1);
push(@image,"./img/$no.gif");
}
print "Content-type:image/gif\n\n";
binmode(STDOUT);
print &gifcat'gifcat(@image);
------------------------------------------------------
というコードで、数字を画像表示させられるというのは分かるのですが、
なにぶん小数点が含まれるとなると・・・・どうしたらよいか・・・・
ちなみに「img」ディレクトリに「0.gif〜9.gif」という数字の画像と
「point.gif」という小数点を表示する画像が入っています。
どうかよろしくお願いします orz
0123nobodyさん
2006/07/02(日) 00:05:54ID:???未だにperl4なのがアレだけど…。多分、以下の1行入れるだけでいける。
for($i = 0; $i < length($cout); $i++){
$no = substr($cnt,$i,1);
$no = 'point' if ($no eq '.'); ### この行を入れる ###
push(@image,"./img/$no.gif");
}
0124122
2006/07/02(日) 00:29:28ID:???え・・・>>122は入門書っぽい本を参考にして組んだのですが・・・
何かまずかったでしょうか・・・?
とりあえずありがとうございました orz
0125nobodyさん
2006/07/02(日) 04:58:17ID:???0126119
2006/07/02(日) 13:06:22ID:???ありがとうございました、希望の動作になりました。
Perl はコードが省略化されて読めなかったりするのですが、
119のリンク先では↓の部分が難解でした。もしよければ解説おねがいします。
print qq|<li><a href="http://search.cpan.org/search?module=$_">$_</a></li>\n|
for sort
map {$_ =~ m/^.+?"Module" (.+?)$/}
qx/perldoc perllocal/;
# printの行は↓に変更、最後にセミコロンを付けるとエラー
# print "<li><a href=http://search.cpan.org/search?module=$_>$_</a></li>\n"
# for sortの行は理解不能無理、こんなループ見たことない検索しても出てこない
# mapの処理自体は分かるが、左に代入先などがないので出力が分からん・・・
# qxは調べて分かった。でもどういう出力に・・・
0127nobodyさん
2006/07/02(日) 13:35:34ID:???qx: qxの実行結果を
map: map に通してモジュール名だけ抜く
sort: ↑をソートして
for: そのそれぞれについて(foreach)
print: print
0128119
2006/07/02(日) 14:16:29ID:???ありがとうございます、↓やっと分かってきました。
use strict;
my %c;
my @qx = qx/perldoc perllocal/;
my @module = map {$_ =~ /^.+?"Module" (.+?)$/} @qx;
my @modlist = grep { !$c{$_}++ } @module;
@modlist = sort @modlist;
foreach (@modlist) { print "<li>$_</li>\n"; }
0129nobodyさん
2006/07/02(日) 17:13:00ID:???エラーメッセージが一つしか表示されない。
もう一つ表示するはずなんだが・・・。
&error("ダメだ","ダメっす");
コレだと『ダメだ』しか表示されない・・・。
『ダメだ』と『ダメっす』をランダムってか表示させたいんだが
0130nobodyさん
2006/07/02(日) 17:36:43ID:???配列の一番はじめの要素
>&error("ダメだ","ダメっす");
サブルーチンに配列で引数渡してるところ
>コレだと『ダメだ』しか表示されない
アタリマエ
0131nobodyさん
NGNGprint $_[int(rand(scalar(@_)))];
}
我ながら酷いコードだな
0132nobodyさん
2006/07/02(日) 18:36:42ID:n0vd3nFA今回UTF-8を使用しようと思いjcode.pmでエンコードしようとしたのですが
一部の文字列が文字化けすることに気づきました。
例)心霊
ちなみにエンコード方法は
Jcode::convert (\$value, 'utf8');
としているだけで特に怪しいことはしていないと思います
ちなみにそこを#でコメントアウトしてみると
フォームページ自体をUTF-8で書いているため
さきほどの「心霊」と言った文字列も問題なく表示されるわけですが
フォームページをEUC-JPなどにすると
当然のごとくEUC-8になってしまうため問題があります
何か私自身の書き方に問題があるのでしょうか?
それとも仕様なのでしょうか?
お手数をおかけして大変申し訳ありませんがご教示頂けると嬉しいです
よろしくお願い致します
0133nobodyさん
2006/07/02(日) 18:53:53ID:???0134nobodyさん
2006/07/02(日) 18:58:30ID:???いまんとこ解決というかそれは当たり前というか。
>>130 も書いている通りなんだが。
>>131 もなんか書いてるし。
それを参考にどうぞ。
0135nobodyさん
2006/07/02(日) 19:00:42ID:???配列の添え字は整数しかとらないんだし、
randの引数はスカラーコンテキストだからこれで良いじゃないか。
sub error { print $_[rand @_] }
>>132
何をしようとしているときに問題が発生するのかが良くわからんので、問題が発生するときの
・内部エンコーディング(UTF-8ならutf-8フラグはあるのかどうかも出来れば)
・出力/入力するエンコーディング
・どっちの方向に変換しようとしているのか
辺りを詳しく。
スクリプトの内部処理をUTF-8で行って、出力するページのエンコーディングを
EUC-JPにしようとしているわけ?勘では多分、使い方の間違いだ。
Jcode::convert(\$value, '変換先のエンコーディング', '元の文字列のエンコーディング');
ってやって見れ
0136132
2006/07/02(日) 19:09:39ID:n0vd3nFAごめんなさい、誤解させてしまうような書き方をしてしまいました
基本的には内部においてUTF-8で処理したいのです
eucやsjisに変換する気はありません
ただどんな文字コードでフォームから入力されても
UTF-8に変換したいために
Jcode::convert (\$value, 'utf8');
としています
# 現在のブラウザではフォーム入力ページがUTF-8なら
# UTF-8で文字コードを送信してくれるという話なので(どっかで聞きました)
# Jcode::convert (\$value, 'utf8');
# をしなくても実害はないといえば実害がないのですが
# 万が一sjisとかで送信してくるブラウザ等があった場合にも
# 対応したいと思い変換処理させています
ところでUTF-8フラグはEncodeモジュール以外でも必要なのでしょうか?
(今回の件で色々ぐぐっていたときUTF-8フラグというものについても読んだのですが
Jcodeモジュールを使う時にフラグ云々という話は出てこなかったので不要なのかと思っていました)
続きます
0137nobodyさん
2006/07/02(日) 19:10:50ID:???を
jcode($value)->utf8();
にしてみたら?
自動判別が働いて正しく格納されるはず。
入力のエンコードを誤認してたらどうしようもないけどね
0138nobodyさん
2006/07/02(日) 19:11:56ID:n0vd3nFAsub decode {
my ($buffer, $key, $value);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read (STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach (@pairs) {
($name, $value) = split(/=/);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
Jcode::convert (\$value, 'utf8');
$in{$name} = $value;
}
}
0139nobodyさん
2006/07/02(日) 19:16:54ID:???># 万が一sjisとかで送信してくるブラウザ等があった場合にも
># 対応したいと思い変換処理させています
そりゃおまいさんがどんなコンテンツを管理しているかによる。
UTF8で書かれたページからshiftjisで
しかもフォームデータをエンコードもせずにダイレクトで送ってくるブラウザ
使ってる奴なんて死ねばいいと思うよ
0140nobodyさん
2006/07/02(日) 19:19:08ID:???0141nobodyさん
2006/07/02(日) 19:23:43ID:n0vd3nFAjcode($value)->utf8();
にしてみたら上手く行ったかと思ったのですが
ためしにフォームページをEUC-JPにして入力してみると
入力された文字列はEUC-JPのまま出力されていました・・・
>>139
>しかもフォームデータをエンコードもせずにダイレクトで送ってくるブラウザ
>使ってる奴なんて死ねばいいと思うよ
もうちょっと正直に書きますと
ある分野のデータベースを作っているのですがその検索フォームを
「自分のサイトにつけたい人はどうぞ」
という風にしたいと考えているのです
ですのでその入力ページがeucもあればsjisもあるかと思うので
鯖側でUTF-8に変換したいなあと・・・
最後まで解決しなければその案は断念しますがw
0142nobodyさん
2006/07/02(日) 19:47:20ID:???切り分けができてないな。そんなに長いプログラムではどこで
間違ってるか特定できないだろ。
Jcode::convertを疑うのなら、4valueにこの値をいれて
Jcode::convertを呼んだらこれこれこうなったけど
期待している値はこれだというのを示さないと。
0143nobodyさん
2006/07/02(日) 20:06:33ID:n0vd3nFAえっと・・・このソースの大半は一般的な入力データ処理だと思いますが・・・
とりあえず>>132で書いた通り
Jcode::convert (\$value, 'utf8');
をコメントアウトすれば問題なく処理されます
一応文字化けした結果も載せておくと
「心霊」をUTF-8で記載されたページから入力すると
unpackされた値は「%E5%BF%83%E9%9C%8A」になりそれをpackして
Jcode::convert (\$value, 'utf8');
で変換すると「綽??」(← 文字化けしたもの)
となってしまうというわけです(当然期待している値は「心霊」です)
ちなみに「心」だけでも「霊」だけでも正常に出力されます
0144nobodyさん
2006/07/02(日) 20:40:15ID:???utf8フラグと文字コードのダンプぐらい示さないと。
0145nobodyさん
2006/07/02(日) 20:48:13ID:???Jcode::convert (\$value, 'utf8', 'euc');
と
Jcode::convert (\$value, 'utf8', 'sjis');
ってやった結果も記してくれんかな
0146nobodyさん
2006/07/02(日) 20:55:32ID:???ttp://www.russky.net/article/list.asp?id=855
これは gb2312 だけど euc-kr にも日本語のひらがなが入っていたようないないような。
0147nobodyさん
2006/07/02(日) 21:13:47ID:???0148nobodyさん
2006/07/02(日) 21:35:08ID:???「綽??」ってのはUTF-8の文字列をEUC-JPとして見たときのものだ。
つまり変換自体には問題はなくて、結果を表示するページを
間違えてUTF-8じゃなくEUC-JPにしてしまっている、と。
0149nobodyさん
2006/07/02(日) 21:47:43ID:pDw8h7zXtr/\x0D\x0A/\n\n/;
とかって、改行コードの統一処理はどのタイミングでやるもの?
何かファイルを読み込むごとに毎回するもの?
0150nobodyさん
2006/07/02(日) 21:52:43ID:???統一しちゃうね。場合によっては無駄になることもあるけどわかりやさ
優先。
0151132
2006/07/02(日) 22:03:39ID:n0vd3nFA>>143の??は実際には文字化けの□をもっと縦長にした感じのが出ています
ただここにコピペしたら?に変換されてしまったわけで
>>145
入力ページはUTF-8で記載されていますのでその上での結果です
>Jcode::convert (\$value, 'utf8', 'euc');
「綽??」
>Jcode::convert (\$value, 'utf8', 'sjis');
「蠢?怺」
ちなみに↑の例ですが入力ページをそれぞれeucおよびsjisに変えたら問題ありませんでした
今回の「心霊」のようにそれぞれの文字コードで別の問題ある文字がないとは限りませんが・・・
>>146
そうかもしれません
>>147
その可能性がないとは言えませんが私は適切にやってるつもりなのでなんとも
>>148
ブラウザでのエンコードはUTF-8になっていることを確認した上で見ています
なのでブラウザの問題ではなくむしろ下に書くように
jcode.pmモジュールがUTF-8をEUC-JPに誤読しているのかと・・・
つづく
0152132
2006/07/02(日) 22:04:39ID:n0vd3nFAJcode::convert (\$value, "utf8", "utf8");
正しく「心霊」と表示されました
また「心」と「霊」は単独で正確に表示できることから
思うに「心霊」と続けて入力したとき
繋がっている部分の文字列から文字コードをEUC-JPと判断された上で
UTF-8に変換しているのではないかと個人的には思っています
例) #文字コードについて調べるのが面倒なので下記のような仮定で・・・
UTF-8 : 心→aaaaaa 霊→bbaabb
EUC-JP : 綽→aaaa ?→aabb ?→aabb
今めちゃくちゃ眠いので
もしかしたら落ちてしまって反応明日以降になっちゃうかも・・・
そのときはごめんなさい
あと、忘れていたのですが、ご回答頂いた方々、ありがとうございます
0153nobodyさん
2006/07/02(日) 22:07:24ID:???それは、
「コードの最初の方に1箇所だけ統一処理を置いて読み込む度に処理される」
ということを意味してるのか、
「必要不要は置いといて、オープンする度に毎回とりあえず統一処理する」
ということなのか、どっちの意味ですか?
読解力不足ですみません。
0154148
2006/07/02(日) 22:27:28ID:???そうか、ごめん。こっちの環境ではちゃんと自動認識できてたもので、つい。
なら、SJISの一バイトカナの問題もあるし、
呼び出し元のフォームでエンコーディングを指定してもらうか、
もしくはフォームに適当なマルチバイト文字列を埋め込んでおいて、
それが何になったかでエンコーディングを調べるってのはどうよ。
# formにはaccept-charsetなんてのもあるのだけれど、IE対応してないんじゃ仕方ない…
0155132
2006/07/02(日) 22:38:32ID:n0vd3nFAご回答くださり有難うございます
なるほど、その方法がありましたね
ソース見られるとちょっと不恰好だけど・・・
てゆーか素朴な疑問なのですが
jcodeモジュールを使っている人で同じような問題に当たった人って居ないのかなあ・・・
eucで「〜」を入れるとNGというのは発見したのですが
# ちなみに入力ページをEUC-JPにした上で「〜」を入力したところ確かにNGでした
自分一人だとしたら、やっぱり何か私の書き方がおかしいんだろうな・・・
jcode.plではこんなこと一回もなかったのでjcode.pmが嫌いになりそう
0156nobodyさん
2006/07/02(日) 22:45:18ID:???0157nobodyさん
2006/07/02(日) 22:49:46ID:???Jcode::convertには
"\xe5\xbf\x83\xe9\x9c\x8a"
という「心霊」をutf8にしたバイト列を食わしているわけだが、
$Jcode::DEBUG=3にしてこいつを変換すると
>DEBUG:sjis = 6, euc = 2, utf8 = 6 at 〜
と出るので、sjisとutf8のスコアが同点でどっちにも決められない
状態になっていることがわかる。
これは避けられないことなので、普通はhiddenで判定用文字列を
渡してどういうのが来るかで文字コードを決定し、他のパラメタに
ついてはJcodeの自動判定にたよらずその文字コードを入力コード
に指定してやるのが安全。
0158132
2006/07/02(日) 23:19:43ID:???>>156-157
なるほど、了解しました
とくに>>157さんは細かく調べて頂き深く感謝致します
>>154さんも仰っていたように
判定用文字列を渡してチェックする方向で対処したいと思います
長い時間お付き合い頂き、皆様、本当にありがとうございました
0159nobodyさん
2006/07/02(日) 23:58:34ID:???Jcode.pmはオブジェクト指向が前提だし、その先にはEncodeへの視野がある。
使いこなせないなら無理すんな
0160nobodyさん
2006/07/03(月) 01:25:18ID:???jcode.plはUTF-8に対応して無いんだが
0161nobodyさん
2006/07/03(月) 01:44:49ID:???答えた本人じゃないけど・・・
>「必要不要は置いといて、オープンする度に毎回とりあえず統一処理する」
だと思う
俺も基本的にはデータファイルを読み込むときに改行を統一 (または不要なら削除) してる
「あれ? このデータは改行付だったっけか?」 なんて迷うことも少なくなるので、
自分でどの段階でまとめておくとか、自分なりのルールを決めておくといいかと思います。
0162nobodyさん
2006/07/03(月) 02:25:22ID:???もうこのさいUTF-8でもSJISでもなんでもいいからさ
0163nobodyさん
2006/07/03(月) 07:23:23ID:???utf8の心霊はそんなにもeucっぽいという事?w
でも、実際には文字化けしてるわけで、・・・なんか変な感じだ・・・
0164nobodyさん
2006/07/03(月) 07:27:52ID:???$_[0]=="ダメだ"
$_[1]=="ダメっす"
自分の経験からするとこういうランダムは、すぐにうっとうしくなるw
0165nobodyさん
2006/07/03(月) 09:14:35ID:???unicodeはいい機会だったのだが日本語については従来のコード
との対応について統一に失敗したのでだめぽ。まったく当時その
辺で仕事してた奴らは負の遺産を残してくれたものだ。
0166149
2006/07/03(月) 10:05:01ID:???もう誰もレスくれないと思ってたからちょっと感動。
やっぱり、オープンの度にコード統一する癖付けといた方が何かと良さそうですね。
これで改行統一の野望に一歩近づきました。
ありがとうございます!
0167nobodyさん
2006/07/03(月) 12:27:50ID:???utf8は神。もうちょっとがんばってはほしかったが。
jcode の文字自動判別は前からいろいろ問題あったよね。
length で判定して同じ文字数だったらEUCにするので、
sjis で半角カナだけ書いて文字判別させると文字化けするとかね。
優先順位指定できたらもっと使いやすかったと思う。
0168nobodyさん
2006/07/03(月) 12:30:55ID:???0169nobodyさん
2006/07/03(月) 14:44:46ID:???>jcode の文字自動判別は前からいろいろ問題あったよね。
よくしらないので教えて欲しいんだけど、
utf8で文字化けしないencode方法あるの?
googleとかで文字化けしたの見たことないし方法あるのかなあ。
0170nobodyさん
2006/07/03(月) 18:36:40ID:???ごめん、日本語でおk
(フラグのない) utf8 だって見分けるのは簡単でしょ。
最初の文字から最後の文字まで ascii と utf8 だけだったら utf8 てすればいい。
ああいう特徴的な文字の並びはほぼ間違いなく utf8 なんだから。
掲示板とかで sjis で HTML 書いてて、ほとんどそのフォームからデータ送信して受け取るのに、
euc と sjis が候補にあがった場合、わざわざ euc だと推測するのはおかしいでしょ?
その推測を頼りに決定しまってるのが jcode の convert というか getcode の欠点。
半角カナの文字化けだって、sjis 判定に半角カナのコード範囲を入れてないから起こるもの。
だから、何でもかんでも 1行で変換を済まそうとせず、
一旦 Encode::Guess の guess_encoding みたいに推測して文字コードの候補をとり、
複数の候補があった場合、プログラマがどっちを優先して変換するか書いて決めればいいんじゃないかと思うわけ。
長ぇ!
0171nobodyさん
2006/07/03(月) 19:43:50ID:???送信すれば?
<input type="hidden" name="encoding" value="sjis">
バイナリから推測なんてメンドクサイ、ムズカシイ、確実じゃない、いい事何もない。
0172nobodyさん
2006/07/03(月) 19:47:02ID:???利用者が文字コード知ってて、しかもフォーム書き換えてくれるなんて
あまり期待できないと思うけど。
0173nobodyさん
2006/07/03(月) 20:01:53ID:???http://〜/~.cgi?q=ほげほげ
ってやったときの文字コードなんて何になるかわかんないしな
0174nobodyさん
2006/07/03(月) 20:41:54ID:DxhEPLl+open(FH,$FILE);
while(<FH>){
if(マッチ条件){処理}
push(@newdata,$_);
}
とすると、マッチして書き換えた後もファイルの中身を最後まで読み込んで無駄な処理が出てしまいます。
lastとかで飛ばしたいところですが、そうするとファイルの中身が書き換えた行以降消えることになります。
こういうとき、どういう処理をすれば無駄なく完遂できるんでしょうか?
セオリーみたいなものがあれば教えて下さい。
0175nobodyさん
2006/07/03(月) 20:50:54ID:???自分のページにフォーム作ろうなんて考える利用者はHTMLぐらいかけるでしょ普通
で、文字コード別にフォームのソース置いといて、化けない奴使ってね、て書けばたぶん分かる。
何にも知らない人はそもそも変なフォームから送信してこないので問題ないと思う・・・
>>173
フォームから入力したいって言ってるんだからGETメソッドに対応しなければいいのでは?
どうしてもGETも対応したいって場合も、ばけたら&en=***なんとかを付けて見て下さいみたいな
誘導でなんとかなりそう・・・
そもそも、アドレス欄からクエリー送信してくるのは上級者だと思う
0177nobodyさん
2006/07/03(月) 21:08:28ID:???それを守ってくれればいいのだが、とんでもないのが存在するのも現実だ。
一番ひどいと思ったのはhiddenとそれ以外で別のコードで送ってきやがった
某ブラウザ。数年前の話だから今は改善されてるかな。
0178nobodyさん
2006/07/03(月) 21:11:39ID:???176の指摘はおいとくとしても、偶然同じ長さの行に書きかえるのでない限り
それ以後の内容を前後にずらす必要があるので、そういうことは考えるだけ
無駄ですな。
File::Inplaceの使用をお勧めする。
0179nobodyさん
2006/07/03(月) 21:14:39ID:???一気に read でファイルの中身全部読み込んじゃって、
あとは s{^(マッチ条件).*}{ 処理 }em; とかして、
一気に書き出せばいいんじゃね?
0180174
2006/07/03(月) 22:04:52ID:DxhEPLl+いや、確かにファイルの中身自体は消えてませんが、そういうことでは…。
>>178
多少の無駄には目をつぶって最後まで走らせておくのが吉なんですかね。
File::Inplaceについては調べてみます。ありがとうございました。
>>179
確かに正規表現で1回マッチ直後に処理すれば、無駄はなくなる…けど、
処理そのものの負担が大きくなってしまうような…。
色んな場面で必要にかられる処理だと思ったので、
他の人はどんな風に処理してるのか適当にCGIを見てみたところ
>>174に書いてあるのが結構多かったかも。
中には
open(FH,$FILE);
my @data = <FH>;
my $loop = @data;
my $i;
while($loop>0){
@temp = split(/ /,$data[$i]);
if(マッチ条件){
処理
last;
}
$i++;
$loop--;
}
ってのも、ありました。ちょっとゴテゴテしてるなぁ。
0181nobodyさん
2006/07/03(月) 22:05:46ID:???よくlocal何て使わないでmyと書いてあるがすべてmyにしたらダメだよね?
ちょっと違いが分からないので教えて欲しい・・・。
0182nobodyさん
2006/07/03(月) 22:14:19ID:???> 処理そのものの負担が大きくなってしまうような
何でそう思うのかkwsk
my @data = <FH>;
↑こんなことしてる方がよっぽど負担強いてると思うぞw
>>181
コーチ変えたほうがいい。
0183nobodyさん
2006/07/03(月) 22:19:42ID:???KENTが一番楽だったからそれにしてたいが今更コーチ変えろって
簡単で見やすいスクリプトなんてあるの?
何せKENTのスクリプトをみて覚えてきた人間だから今更となると見やすいスクリプトじゃないの無理な気がする。
0185nobodyさん
2006/07/03(月) 22:24:31ID:???0186nobodyさん
2006/07/03(月) 22:48:13ID:???状況は変わると思う。
0187nobodyさん
2006/07/03(月) 22:54:50ID:???任意の一行ってことはマッチする行がはじめから一行しかない
事が分かってるってことですかね?
それともマッチした最初の行だけとか、?(それだと174はまずいですよね・・・
ファイルの構造が固定してるなら、該当する行をダイレクトに指定
できる可能性とかはありえない・・・?
0188nobodyさん
2006/07/03(月) 23:07:15ID:???0189nobodyさん
2006/07/03(月) 23:16:27ID:???初心者のオイラにはなんのこっちゃか分からない行がたくさんあって、ちょっと嫌
0190nobodyさん
2006/07/03(月) 23:20:54ID:???セキュリティくらい考えて作れよー。
まあKENT儲は ∩( ´∀`)∩コチラヘ (っ´∀`)っ))ドウゾ
KENT WEB 総合スレ Part2
http://pc8.2ch.net/test/read.cgi/php/1078991985/
0191nobodyさん
2006/07/03(月) 23:32:34ID:???…向上心があるなら、出来るだけ早い内にPerl5流に馴染んでおいたほうが楽だぞ。本当に…
きっと、各種モジュールに興味が出てきた頃に、矯正するのに時間がかかって苦労する。というか、した。
# 独学だと何がまともなのか、判るようになるまでが難しい
閑話休題。多くの場合では、myに置き換えて大丈夫だと思う。
localとmyの違いは効果の範囲が動的…プログラムの流れに沿ったものか、
静的…ソース上のブロックに対応したスコープか、と言うのが一番の差。
以下、差を顕著にするためのどうしようもない汚い例。
sub fuga { $foo }
sub hoge_my { my $foo = 'hoge'; print 'my: ', fuga(), "\n" }
sub hoge_local { local $foo = 'hoge'; print 'local: ', fuga(), "\n" }
$foo = 'outer'; hoge_local(); hoge_my();
---------------
local: hoge
my: outer
あと型グロブのように、単純にmyに置き換えることの出来ないものもあるけれど、
これも、出来る限りリファレンスを使って書くのがPerl5流。
localの出番はPerlで定義済みの変数($/の類)とか。
何か大事な点がすっぽ抜けてたら、フォロー宜しくお願いします。
■ このスレッドは過去ログ倉庫に格納されています