Perl コーディング初心者質問コーナー Part25
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/28 01:18ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0136nobodyさん
03/07/01 23:25ID:qNSyt42Zリンク先でどのように取得したらよいのですか?
よろしくおねがいします。
0137nobodyさん
03/07/01 23:27ID:???($y)=$ENV{QUERY_STRING}=~/y=([^=]*)/;
0140136
03/07/02 00:49ID:tWYlFrFCご回答ありがとうございました。
このようにしました。
($xdate,$ydate)=split(/&/,$ENV{QUERY_STRING});
($x)=$xdate=~/x=([^=]*)/;
($y)=$ydate=~/y=([^=]*)/;
0142nobodyさん
03/07/02 01:12ID:DMMsk6IB素直にReadParse使えや。
よっぽど簡単
0143nobodyさん
03/07/02 01:17ID:DMMsk6IBhttp://top.dmm.co.jp/
0145nobodyさん
03/07/02 11:29ID:UDPPCCYrFORM間違いの116です。
また、基本的なことで申し訳ありません。
> 0-9a-zA-Z以外のものが入るのなら、変換しとけ。
0-9a-zA-Z は変換する必要なしという事は、これらの文字を
バイナリで表現すれは、どのコード体系でも同じなのですか?
またCGIへの受け渡し文字列中に、「&」や「=」がよく使われますが
これらが含まれていれば変換する必要があるのでしょうか?
まあ、どんな場合でも変換しておけば問題ないのでしょうけど
実際のところが気になったのと、自分自身ではsjisでしか
試す事ができないので、ここでお聞きするしかありません
でした(^_^;)
0146あぼーん
NGNG0147nobodyさん
03/07/02 11:48ID:???1byte文字は文字コード関係ない
urlエンコードについては
http://techtips.belution.com/ja/perl/0000/
0148nobodyさん
03/07/02 11:59ID:???1byte文字でも文字コードは色々種類あるぞ。
よく使われるもので、JIS X 0201 Latinとか、JIS X 0201 Latin
とか、純粋なASCIIとかEBCDICとかあるわけだが。
ISO-646を含めると相当な種類があるわけだが。
まぁ殆どの環境で、JIS X 0201系とASCII系は同じ表示になって
しまうしEBCDICのパソコンなんてほとんど持ってる人がいないから
誰もあんまり気にしてないだけだと思うが。
でも例えば、\100-なんてのは、1byte文字だけど文字コードによっては
バックスラッシュになっちゃう場合もあるわけだが。
(今書いてる文章はShift_JISなので、円記号として使って問題ない)
0149nobodyさん
03/07/02 16:02ID:???どこのレス(スレ)かわからなくなってしまったので、要約して再質問させていただきます。
housemaster.csv から、各行を読み込んで、条件に合致するなら、
その行の文字を表示させるというありがちなものを組んでます。
で、どうしても一部分の行(レコード)のみ、全て文字化けしてしまいます。
なお、検索条件によらず、文字化けする行は、必ず決まってます。(ID1とID24の行、というように)
回答では、「条件」のなかで文字コード関係の処理をしてまちがえてるのでは?
というのがありましたが、条件の中では数字の比較しかしてません。
また、別の回答では、jcodeを自動判別でなくeuc2sjisのようにしたら?
というのがありましたが、これは、全てそのようにしましたが、改善されずです。
他に、どんな理由が考えられるのでしょうか・・・?
0150nobodyさん
03/07/02 16:29ID:???どうやって検索させてるかしらんが念のため確認。
元データ(〜csv)を読み込む際と、検索条件(キーワード?)の
両方ともjcodeは使ってるよな?
どっちか一方だけとかじゃなくて。
0151nobodyさん
03/07/02 16:36ID:???元質問は見てないが、スクリプトやCSVの文字コードが異なっていて
適切に変換されていないとかは?
あるいはCSVデータの中身に問題があるとか。
SJISでそのまま扱うと文字化け起こす文字とかは対策してる?
0152149
03/07/02 16:38ID:???ありがとうございます。
●元データ(〜csv)を読み込む際・・・&jcode::sjis2euc(\$value); してます。
●検索条件(キーワード?)の・・・検索条件といっても、文字でひっかけてるわけでなく、
idや数値の大小(値段ですが)で検索してるだけなので、
jcodeは1回も使ってませんが、ここんとこは問題ないですよねえ・・・・・
0153149
03/07/02 16:40ID:???ありがとうございます。
肝心なこと言い忘れてました。
CSVはすべてSJIS(CSVから読み出すときは&jcode::sjis2euc(\$value);)
スクリプトのコードは全てEUC、
HTMLに出力時は全てSJIS&jcode::euc2sjis(\$value);に変換してます。
0154149
03/07/02 16:43ID:???CSVデータが壊れている?のではと思ったのですが、
秀丸で開いてみたところ、問題はなさそうでした。
あるいは、秀丸で見ても見ることのできない特殊なコード?が紛れ込んでいると
いうことはあるのでしょうか?
もしそうだとしたら、そういった特殊なコードはどうやれば見ることができるのでしょうか
0155nobodyさん
03/07/02 16:44ID:???んじゃとりあえず、CVSを読み込んで、ただ出力するスクリプト書いて、
出力結果を確認してくだちい。
そこで問題がなければ、読み込みには成功してると。
で、あとは順次スクリプト内に、ちょこちょこprintを入れて、
どこで文字化けをしたかチェック。
文字化けした近辺を洗うとよろし。
もしCVSでこけてたら、CVSの文字コードとか、そこら辺をあさるよろし。
あとよくわからんが、半角カナとか使ってると危なそう。
注意されたし。
0157nobodyさん
03/07/02 16:45ID:???バイナリエディタ
> HTMLに出力時は全てSJIS&jcode::euc2sjis(\$value);に変換してます。
eucでなぜ吐かない?
0158155
03/07/02 16:46ID:???>んじゃとりあえず、CVSを読み込んで、ただ出力するスクリプト書いて、
>出力結果を確認してくだちい。
当然、今動かしてるスクリプトと同じ方法で処理して出力してね。
(jcodeとか使ってるなら、全く同じような処理で)
0159149
03/07/02 17:33ID:???以下のスクリプトで、正常にSJISではきだされました・・・
ちょこちょこprintを入れて、ためしてみたいとおもいます・・・
open(IN, "< ./housemaster.csv") or die("cannot open:$!"); # 読みのみモードで開く
while ($line = <IN>){
#Perlメモ様様
$line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN));
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
#必要なものだけをEUCにして、出力時にSJISにする
foreach $value (@values){
&jcode::sjis2euc(\$value);
}
#必要なものだけをEUCにして、出力時にSJISにする
foreach $value (@values){
&jcode::euc2sjis(\$value);
}
#Perlメモ様様
$line = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @values;
print qq|$line a\n|;
}
close IN;
0160149
03/07/02 17:35ID:???「スクリプト内はすべてEUCで通して、入出力のみSJISに変換」
というポリシーだと大丈夫だと聞いたことがあるのですが、
違います?
0161149
03/07/02 17:36ID:???あ、バイナリエディタ・・・使ったことないけど試してみます。
>eucでなぜ吐かない?
個人的にはそうしたいんですけどね・・・
サイト内の静的ページがみなSJISなので、CGIのページだけEUCというのも、
なんか変かなと。。。
0163149
03/07/02 18:15ID:???for ($i=0;$i<=$#houselist;$i++){
foreach $key (keys %{$houselist[$i]}){
&jcode::euc2sjis(\$houselist[$i]->{$key});
}
}
としなくちゃいけないのを、
for ($i<=0;$i<=$#houselist;$i++){ のように、「$i<=0」
となってました。。。
変なfor文ならエラーにしてくれればいいのに・・・
ともかく、お騒がせしてすみませんでした。
0165155
03/07/02 18:18ID:???(俺もついさっきまで、連想配列のnameを間違っていて「動かねえ!」と
騒いでいたのは内緒)
こまめなチェックを心がけませう。
(人の事いえないけどネー)
ガンガレー
0166149
03/07/02 19:20ID:???いやいやほんとすんませんです。
なにげに、Perlを仕事としてやりはじめてまだ3ヶ月なもので、学ぶこと多いです。
(つーか、この部署プログラマ他にいないもんで、2chで質問してしまいましたw)
おたがいがんがりましょう
0168nobodyさん
03/07/02 21:03ID:???0169nobodyさん
03/07/02 21:05ID:???0172nobodyさん
03/07/02 22:54ID:???0173nobodyさん
03/07/02 23:23ID:???0174nobodyさん
03/07/03 00:06ID:???0176nobodyさん
03/07/03 00:10ID:???0177nobodyさん
03/07/03 00:42ID:???0178nobodyさん
03/07/03 01:30ID:???是非とも業務で活かしてくれ給え
0179nobodyさん
03/07/03 09:34ID:???(a: awk; p: perl; r: ruby; j: javascript)
a2p ある 糞
perlcc ある 糞
p2r
r2p
j2p
p2j
とくに、javascriptをperlCGIに変換したいと思っています。
0180nobodyさん
03/07/03 09:38ID:R4mGR+/mperlに挑戦しようと思っているのですが、
入門サイト等が見つかりません。
どこかおすすめないでしょうか
0182nobodyさん
03/07/03 09:49ID:???0183nobodyさん
03/07/03 10:30ID:???動作すれば良し
0184nobodyさん
03/07/03 12:43ID:LERgN2mAアフォには、「ありえない」だろな(ry
じゃ、自分で書くからいいよ。
もういくつか書いてるけど、その場しのぎの物になってる。
ある程度汎用性持たせてて書いてやろう。
0185nobodyさん
03/07/03 12:45ID:???0187nobodyさん
03/07/03 12:52ID:???指摘・批判されたら逆切れってパターンの奴。
多分釣りしてスレが荒れるのを楽しんでるだけだと思うので、スルーでお願いします。
0188nobodyさん
03/07/03 12:54ID:???0190nobodyさん
03/07/03 12:56ID:???これは嘘。
0191nobodyさん
03/07/03 13:57ID:???0192nobodyさん
03/07/03 14:00ID:???0193nobodyさん
03/07/03 14:02ID:???0194179=184
03/07/03 14:30ID:???君らち、そんなの意味ないよ。
漏れはサ、javascriptでな、自学自習の問題を出してるわけさ。
その中からな、多少変形しながら、CGIの問題を作ってるわけさ。
jsじゃな、外部ファイルにして読めないdirに置いた上にな、pragmaで
no-cache指定してもな、どうしてもcacheで見えちゃうんだな答えが。
Perl CGIでな、外との接続を絶ったコンピュータ室で試験させよう
としているわけさ。
perl2rubyはな、Perlユーザのためのruby入門って本、読んでな、
簡単な部分はP2Rに翻訳できそうだと思ったからだな。
君らちとは、レベルが違うわな。
0195nobodyさん
03/07/03 14:31ID:???0196nobodyさん
03/07/03 14:34ID:???0199nobodyさん
03/07/03 14:39ID:???それってASPとかじゃなくてクライアントサイドってことだよな?
だとするとアクセスできないディレクトリに置いたら動かないだろw
で、クライアントサイドとサーバサイドじゃ処理が違うのに変換???w
0200nobodyさん
03/07/03 14:40ID:???0202nobodyさん
03/07/03 14:43ID:???0203nobodyさん
03/07/03 14:44ID:???0204nobodyさん
03/07/03 14:46ID:???僕もがんばります!!
0205nobodyさん
03/07/03 14:49ID:???0206nobodyさん
03/07/03 14:54ID:???0207nobodyさん
03/07/03 15:01ID:???だけどお前の頭の中は、シンジュじゃ無くてPerlだよ、なら書いた
0208nobodyさん
03/07/03 15:08ID:Ctng5Cwyperl -pe 'chop; $_="print `\Q$_\E`;\n"'
0209107
03/07/03 15:39ID:???#!/perl/bin/perl
use Net::Ping;
#適当なネットワークIP
$host = "210.***.***.***";
#IPを数えるカウント
$count = 0;
($sec, $min, $hou, $day, $mon, $yea, $wek) = localtime();
$yea=$yea+1900;
$mon=$mon+1;
while (1) {
if (pingecho($host, 5)) {
$count=0;
print "$yea/$mon/$day $hou:$min:$sec Count:$count IP:$host is alive.\n";
}else{
$count++;
print "$yea/$mon/$day $hou:$min:$sec Count:$count IP:$host is no return.\n";
}
if ($count > 3) {
print "$yea/$mon/$day $hou:$min:$sec Count:$count IP:$host is dead.\n";
last;
}
sleep(5);
}
while (1) {
print "モデムが停止しましたー\a\n";
sleep(1);
}
0210209
03/07/03 16:00ID:???0211nobodyさん
03/07/03 16:05ID:Ctng5Cwyその「適当なネットワークIP」って、他人のリソースじゃないだろうな?
Pingは負荷が大きいから、回線の生死にPingを打つのは問題ありだと
思うんだけど。LAN中ならいいけど、外に出すのはマナー上良くないと
思われる。
もし俺がネットワーク管理者で、どっかのクライアントからPingが垂れ流されて
きたら、いたずらか攻撃だと判断してフィルターかけるよ。
0212あぼーん
NGNG0213nobodyさん
03/07/03 16:30ID:???Net::Pingは、デフォルトでTCPのECHOにConnectするようになってるよ。
ICMP(いわゆるPing)は指定しないと使わない。
まあどのみち他人のホストを回線チェックに使うのは感心しないけど。
0214nobodyさん
03/07/03 17:13ID:83sptUFLprint $value;
HTMLの見栄え表示用に半角数字を全角数字に置き換えを行っていますが
文字化けします。元は一桁か二桁の半角数字です。
座、とか抗とか、、、
$value =~ tr/0-9/a-j/;
だと上手くいきます。
コードはEUC-JPで書いてます。
日本語処理の問題だと思うのですがいろいろ調べてみてもわかりませんでした。
ちなみに日本語関係はJcode.pm使えます。
どなたか教えて下さい
0215nobodyさん
03/07/03 17:27ID:???jperlでない限り、tr///は2バイト文字をサポートしていません。
したがって、>>214のtr文は、
・0の1バイト目
・0の2バイト目〜9の1バイト目
・9の2バイト目
が指定されたように受け取ります。Jcode.pmを使っているのなら、
jcode($value)->tr('0-9', '0-9');
を試してみてください。
0217nobodyさん
03/07/03 17:32ID:???$value =~ s/0/0/g;
$value =~ s/1/1/g;
$value =~ s/2/2/g;
$value =~ s/3/3/g;
$value =~ s/4/4/g;
$value =~ s/5/5/g;
$value =~ s/6/6/g;
$value =~ s/7/7/g;
$value =~ s/8/8/g;
$value =~ s/9/9/g;
(w
0219nobodyさん
03/07/03 17:42ID:???$value =~ s/([0-9])/('0','1','2','3','4','5','6','7','8','9')[$1]/eg;
つぅのはどうでしょう?
0220215
03/07/03 17:50ID:???それだったら
$value =~ s/([0-9])/pack("c2", 0xa3, 0xb0+$1)/eg;
の方が良くないか?
文字コードに依存するやりかたは良くないと思う。
0223nobodyさん
03/07/03 20:28ID:Ctng5Cwyその直前で$valueをEUCに変換してるという前提だから別に構わないでしょ。
>>217や219だってISO-2022-JPでやれば一発でエラー(or文字化け)がでるわけで。
0224nobodyさん
03/07/03 20:36ID:???常套手段と同様に、
EUCに揃えてから好きに加工、というのは
普通にアリだな
0225nobodyさん
03/07/03 21:16ID:???0226nobodyさん
03/07/03 21:52ID:???あー、変換してからか。スマソ。
それでも個人的にはわかりやすいほうが良いな。
0228nobodyさん
03/07/03 23:25ID:z1S7djbc0229あぼーん
NGNG0230nobodyさん
03/07/04 11:23ID:???0231nobodyさん
03/07/04 12:28ID:???0232nobodyさん
03/07/04 12:32ID:???分かりやすさを採るか効率を採るかだと思うけど、
>>217は効率悪すぎ。
>>231
unlink <./tmp/*>;
0234nobodyさん
03/07/04 13:04ID:???0235nobodyさん
03/07/04 13:05ID:???ネタだと思いたいが、仕事で他人のコードを見る機会が多いと、
>>217が可愛く見えるくらいの想像を絶するコードに度々遭遇する。
0236nobodyさん
03/07/04 13:10ID:???■ このスレッドは過去ログ倉庫に格納されています