トップページ⇒php
1001コメント315KB

Perl コーディング初心者質問コーナー Part25

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/06/28 01:18ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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
「〜hoge.cgi?x=hage&y=hoge」として渡した「x」と「y」は
リンク先でどのように取得したらよいのですか?
よろしくおねがいします。
0137nobodyさん03/07/01 23:27ID:???
($x)=$ENV{QUERY_STRING}=~/x=([^=]*)/;
($y)=$ENV{QUERY_STRING}=~/y=([^=]*)/;
0138nobodyさん03/07/01 23:28ID:???
>>136
$ENV{'QUERY_STRING'}を&で分割してから=で分割する
0139nobodyさん03/07/01 23:31ID:???
>>137
$x = hage&y
$y = hoge
014013603/07/02 00:49ID:tWYlFrFC
>>137-139
ご回答ありがとうございました。
このようにしました。

($xdate,$ydate)=split(/&/,$ENV{QUERY_STRING});

($x)=$xdate=~/x=([^=]*)/;
($y)=$ydate=~/y=([^=]*)/;

0141nobodyさん03/07/02 01:01ID:???
>>140
それじゃダメだって
0142nobodyさん03/07/02 01:12ID:DMMsk6IB
>>140
素直にReadParse使えや。
よっぽど簡単
0143nobodyさん03/07/02 01:17ID:DMMsk6IB
IDがDMM
http://top.dmm.co.jp/
0144nobodyさん03/07/02 02:22ID:???
>>140
dateってなんやねん
0145nobodyさん03/07/02 11:29ID:UDPPCCYr
>>130
FORM間違いの116です。
また、基本的なことで申し訳ありません。

> 0-9a-zA-Z以外のものが入るのなら、変換しとけ。
0-9a-zA-Z は変換する必要なしという事は、これらの文字を
バイナリで表現すれは、どのコード体系でも同じなのですか?
またCGIへの受け渡し文字列中に、「&」や「=」がよく使われますが
これらが含まれていれば変換する必要があるのでしょうか?
まあ、どんな場合でも変換しておけば問題ないのでしょうけど
実際のところが気になったのと、自分自身ではsjisでしか
試す事ができないので、ここでお聞きするしかありません
でした(^_^;)
0146あぼーんNGNG
あぼーん
0147nobodyさん03/07/02 11:48ID:???
>>145
1byte文字は文字コード関係ない
urlエンコードについては
http://techtips.belution.com/ja/perl/0000/
0148nobodyさん03/07/02 11:59ID:???
>>147
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:???
>>149
どうやって検索させてるかしらんが念のため確認。
元データ(〜csv)を読み込む際と、検索条件(キーワード?)の
両方ともjcodeは使ってるよな?
どっちか一方だけとかじゃなくて。
0151nobodyさん03/07/02 16:36ID:???
>>149
元質問は見てないが、スクリプトやCSVの文字コードが異なっていて
適切に変換されていないとかは?
あるいはCSVデータの中身に問題があるとか。
SJISでそのまま扱うと文字化け起こす文字とかは対策してる?
015214903/07/02 16:38ID:???
>>150
ありがとうございます。
●元データ(〜csv)を読み込む際・・・&jcode::sjis2euc(\$value); してます。
●検索条件(キーワード?)の・・・検索条件といっても、文字でひっかけてるわけでなく、
idや数値の大小(値段ですが)で検索してるだけなので、
jcodeは1回も使ってませんが、ここんとこは問題ないですよねえ・・・・・
015314903/07/02 16:40ID:???
>>151
ありがとうございます。
肝心なこと言い忘れてました。
CSVはすべてSJIS(CSVから読み出すときは&jcode::sjis2euc(\$value);)
スクリプトのコードは全てEUC、
HTMLに出力時は全てSJIS&jcode::euc2sjis(\$value);に変換してます。
015414903/07/02 16:43ID:???
検索条件によらず、CSVファイルの、必ず同じ行(レコード)が文字化けしていることから、
CSVデータが壊れている?のではと思ったのですが、
秀丸で開いてみたところ、問題はなさそうでした。

あるいは、秀丸で見ても見ることのできない特殊なコード?が紛れ込んでいると
いうことはあるのでしょうか?
もしそうだとしたら、そういった特殊なコードはどうやれば見ることができるのでしょうか
0155nobodyさん03/07/02 16:44ID:???
>>152
んじゃとりあえず、CVSを読み込んで、ただ出力するスクリプト書いて、
出力結果を確認してくだちい。
そこで問題がなければ、読み込みには成功してると。
で、あとは順次スクリプト内に、ちょこちょこprintを入れて、
どこで文字化けをしたかチェック。
文字化けした近辺を洗うとよろし。

もしCVSでこけてたら、CVSの文字コードとか、そこら辺をあさるよろし。

あとよくわからんが、半角カナとか使ってると危なそう。
注意されたし。
0156nobodyさん03/07/02 16:44ID:???
>>153
SJIS→EUC→SJISじゃ、SJISでの文字化けの問題がそのまま
現れるでしょ。
0157nobodyさん03/07/02 16:45ID:???
>>154
バイナリエディタ

> HTMLに出力時は全てSJIS&jcode::euc2sjis(\$value);に変換してます。
eucでなぜ吐かない?
015815503/07/02 16:46ID:???
追記
>んじゃとりあえず、CVSを読み込んで、ただ出力するスクリプト書いて、
>出力結果を確認してくだちい。

当然、今動かしてるスクリプトと同じ方法で処理して出力してね。
(jcodeとか使ってるなら、全く同じような処理で)
015914903/07/02 17:33ID:???
>>155
以下のスクリプトで、正常に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;
016014903/07/02 17:35ID:???
>>156
「スクリプト内はすべてEUCで通して、入出力のみSJISに変換」
というポリシーだと大丈夫だと聞いたことがあるのですが、
違います?
016114903/07/02 17:36ID:???
>>157
あ、バイナリエディタ・・・使ったことないけど試してみます。
>eucでなぜ吐かない?
個人的にはそうしたいんですけどね・・・
サイト内の静的ページがみなSJISなので、CGIのページだけEUCというのも、
なんか変かなと。。。
0162nobodyさん03/07/02 18:13ID:???
>>161
ブラウザはそんなサイト内で統一された文字集合(?)は気にしないぞ。

変だと思うのは人間だけ。
016314903/07/02 18:15ID:???
print とか「=cut」しまくってたら、おかしい場所がわかりますた・・・
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文ならエラーにしてくれればいいのに・・・
ともかく、お騒がせしてすみませんでした。
016416103/07/02 18:16ID:???
>>162
いや、昔のブラウザは、同じサイト内でSJISからEUCのページにとんだら、
化けてたんですよ。。。そのトラウマかもw
016515503/07/02 18:18ID:???
まあ、良くある事ですな。
(俺もついさっきまで、連想配列のnameを間違っていて「動かねえ!」と
騒いでいたのは内緒)

こまめなチェックを心がけませう。
(人の事いえないけどネー)
ガンガレー
016614903/07/02 19:20ID:???
>>165
いやいやほんとすんませんです。
なにげに、Perlを仕事としてやりはじめてまだ3ヶ月なもので、学ぶこと多いです。
(つーか、この部署プログラマ他にいないもんで、2chで質問してしまいましたw)
おたがいがんがりましょう
0167nobodyさん03/07/02 19:25ID:???
解決おめ。

ところで「CVS」ではないと思うぞ>>155
0168nobodyさん03/07/02 21:03ID:???
漏れも CVS と CSV は良く混乱する
0169nobodyさん03/07/02 21:05ID:???
間違って打ってるときはあるな。
017015503/07/02 21:39ID:???
>>167
おぅシット。
ついつい間違えてしまいますた(苦笑

>>168>>169
仲間ハケーン、心強い(藁
0171nobodyさん03/07/02 22:39ID:???
>>164
吐き出したHTMLで、キチンと文字コードの指定をすれ。
ブラウザの自動判別なんぞいう間抜けにまかせるからそうなる。
0172nobodyさん03/07/02 22:54ID:???
漏れも キチン と チキン は良く混乱する
0173nobodyさん03/07/02 23:23ID:???
CVSが Concurrent Version System の略だと最近知ったオレ。
0174nobodyさん03/07/03 00:06ID:???
漏れもコンマとマン*はよく混乱する
0175nobodyさん03/07/03 00:09ID:???
>>174
どっかのサポセンに説明するとき使ってみようかな
0176nobodyさん03/07/03 00:10ID:???
CVS = ConVenience Store = コンビニエンス・ストア
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+/m
perlが全くわかりません。
perlに挑戦しようと思っているのですが、
入門サイト等が見つかりません。
どこかおすすめないでしょうか
0181nobodyさん03/07/03 09:45ID:???
>>180
マジレスすると、とほほで良いんじゃないかと
0182nobodyさん03/07/03 09:49ID:???
179 ありえない アホ
0183nobodyさん03/07/03 10:30ID:???
perlの言語仕様が、a2pが通るようにできてるからな
動作すれば良し
0184nobodyさん03/07/03 12:43ID:LERgN2mA
>>182
アフォには、「ありえない」だろな(ry
じゃ、自分で書くからいいよ。
もういくつか書いてるけど、その場しのぎの物になってる。
ある程度汎用性持たせてて書いてやろう。
0185nobodyさん03/07/03 12:45ID:???
JavaScriptのコードををPerlのコードに変換することは不可能と言っているんだと思うけど・・・・
0186nobodyさん03/07/03 12:46ID:???
>>184=他人に聞くだけ聞いといて、自分からは何も情報を出さないクレクレ厨
危うく>>179にマジレスするところだったよ。
0187nobodyさん03/07/03 12:52ID:???
WebProgスレの方にも居たよな、いかにも初心者っぽい中途半端な質問して
指摘・批判されたら逆切れってパターンの奴。

多分釣りしてスレが荒れるのを楽しんでるだけだと思うので、スルーでお願いします。
0188nobodyさん03/07/03 12:54ID:???
JavaScriptで書いたものをPerlに変換し、しかもCGIとして使いたい理由が分からない(^_^;)
0189nobodyさん03/07/03 12:55ID:???
>>188
スルーで。
0190nobodyさん03/07/03 12:56ID:???
> もういくつか書いてるけど、その場しのぎの物になってる。

これは嘘。
0191nobodyさん03/07/03 13:57ID:???
漏れもn88-basicをperlに変換するのはいくつか書いた
0192nobodyさん03/07/03 14:00ID:???
漏れもマシン語をperlに変換するのはいくつか書いた
0193nobodyさん03/07/03 14:02ID:???
俺もHTMLをPerlに変換するのはいくつか書いた。
0194179=18403/07/03 14:30ID:???
>>191->>193
君らち、そんなの意味ないよ。
漏れはサ、javascriptでな、自学自習の問題を出してるわけさ。
その中からな、多少変形しながら、CGIの問題を作ってるわけさ。
jsじゃな、外部ファイルにして読めないdirに置いた上にな、pragmaで
no-cache指定してもな、どうしてもcacheで見えちゃうんだな答えが。
Perl CGIでな、外との接続を絶ったコンピュータ室で試験させよう
としているわけさ。

perl2rubyはな、Perlユーザのためのruby入門って本、読んでな、
簡単な部分はP2Rに翻訳できそうだと思ったからだな。

君らちとは、レベルが違うわな。
0195nobodyさん03/07/03 14:31ID:???
漏れもバッチファイルとシェルスクリプトをperlに変換するのはいくつか書いた
0196nobodyさん03/07/03 14:34ID:???
漏れもゴッホのひまわりをperlに変換するのはいくつか書いた
0197nobodyさん03/07/03 14:37ID:???
漏れも >>191-193 を >>194 に変換するのはいくつか書いた
0198nobodyさん03/07/03 14:39ID:???
>>194
確かに、ネタにそこまでマジレスできる君と俺とでは
かなりレベルが違うようだ。
0199nobodyさん03/07/03 14:39ID:???
>>194
それってASPとかじゃなくてクライアントサイドってことだよな?
だとするとアクセスできないディレクトリに置いたら動かないだろw

で、クライアントサイドとサーバサイドじゃ処理が違うのに変換???w
0200nobodyさん03/07/03 14:40ID:???
俺もダンディ坂野のギャグをPerlに変換するのはいくつか書いた。
0201nobodyさん03/07/03 14:41ID:???
>>199
きっと俺らちとはレベルが違んだよ(w
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:???
俺もPerlをドラクエ風に変換するのはいくつか書いた。
0207nobodyさん03/07/03 15:01ID:???
漏れも、とても綺麗な真珠だね、もっと綺麗な牧シンジュ!
だけどお前の頭の中は、シンジュじゃ無くてPerlだよ、なら書いた
0208nobodyさん03/07/03 15:08ID:Ctng5Cwy
>>195
perl -pe 'chop; $_="print `\Q$_\E`;\n"'
020910703/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);
}
021020903/07/03 16:00ID:???
ログの時間が動いていないことが今判明したTT
0211nobodyさん03/07/03 16:05ID:Ctng5Cwy
>>209
その「適当なネットワークIP」って、他人のリソースじゃないだろうな?

Pingは負荷が大きいから、回線の生死にPingを打つのは問題ありだと
思うんだけど。LAN中ならいいけど、外に出すのはマナー上良くないと
思われる。

もし俺がネットワーク管理者で、どっかのクライアントからPingが垂れ流されて
きたら、いたずらか攻撃だと判断してフィルターかけるよ。
0212あぼーんNGNG
あぼーん
0213nobodyさん03/07/03 16:30ID:???
>>211
Net::Pingは、デフォルトでTCPのECHOにConnectするようになってるよ。
ICMP(いわゆるPing)は指定しないと使わない。
まあどのみち他人のホストを回線チェックに使うのは感心しないけど。
0214nobodyさん03/07/03 17:13ID:83sptUFL
$value =~ tr/0-9/0-9/;
print $value;

HTMLの見栄え表示用に半角数字を全角数字に置き換えを行っていますが
文字化けします。元は一桁か二桁の半角数字です。
座、とか抗とか、、、

$value =~ tr/0-9/a-j/;

だと上手くいきます。
コードはEUC-JPで書いてます。
日本語処理の問題だと思うのですがいろいろ調べてみてもわかりませんでした。
ちなみに日本語関係はJcode.pm使えます。

どなたか教えて下さい
0215nobodyさん03/07/03 17:27ID:???
>>214
jperlでない限り、tr///は2バイト文字をサポートしていません。
したがって、>>214のtr文は、

・0の1バイト目
・0の2バイト目〜9の1バイト目
・9の2バイト目

が指定されたように受け取ります。Jcode.pmを使っているのなら、

jcode($value)->tr('0-9', '0-9');

を試してみてください。
0216nobodyさん03/07/03 17:29ID:???
>>215
>jperlでない限り、tr///は2バイト文字をサポートしていません。
これちょっと嘘だったかも。
0217nobodyさん03/07/03 17:32ID:???
>>214
$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
021821403/07/03 17:41ID:???
>>215

早速ありがとうございました。
御指摘の方法で上手くいきました。
0219nobodyさん03/07/03 17:42ID:???
>>214
$value =~ s/([0-9])/('0','1','2','3','4','5','6','7','8','9')[$1]/eg;
つぅのはどうでしょう?
022021503/07/03 17:50ID:???
>>217>>219
それだったら

$value =~ s/([0-9])/pack("c2", 0xa3, 0xb0+$1)/eg;

の方が良くないか?
0221nobodyさん03/07/03 19:19ID:???
>>214はテンプレ見てねーな
漏れもヘタレだけど、リンク先たどれば解決策はザクザク出るのに
0222 ◆hMJAPH9PWA 03/07/03 20:22ID:???
>>220
文字コードに依存するやりかたは良くないと思う。
0223nobodyさん03/07/03 20:28ID:Ctng5Cwy
>>222
その直前で$valueをEUCに変換してるという前提だから別に構わないでしょ。
>>217や219だってISO-2022-JPでやれば一発でエラー(or文字化け)がでるわけで。
0224nobodyさん03/07/03 20:36ID:???
アルファベットを一旦全部大文字にしてから処理、とかの
常套手段と同様に、
EUCに揃えてから好きに加工、というのは
普通にアリだな
0225nobodyさん03/07/03 21:16ID:???
ところで「日」と「曰」の区別できるようになったの?>えうC
0226nobodyさん03/07/03 21:52ID:???
大と丈の区別は付くようになりました。
0227 ◆hMJAPH9PWA 03/07/03 22:52ID:???
>>223
あー、変換してからか。スマソ。

それでも個人的にはわかりやすいほうが良いな。
0228nobodyさん03/07/03 23:25ID:z1S7djbc
217でいいんだよ
0229あぼーんNGNG
あぼーん
0230nobodyさん03/07/04 11:23ID:???
ブラクラ注意
0231nobodyさん03/07/04 12:28ID:???
./tmp ディレクトリにあるファイルを全て削除するにはどうすればいいのでしょうか?
0232nobodyさん03/07/04 12:32ID:???
>>227>>228
分かりやすさを採るか効率を採るかだと思うけど、
>>217は効率悪すぎ。

>>231
unlink <./tmp/*>;
0233nobodyさん03/07/04 13:01ID:???
>>217はネタでしょ?
0234nobodyさん03/07/04 13:04ID:???
このスレも盛り上がらなくなったな・・・。おまえら書けよ。
0235nobodyさん03/07/04 13:05ID:???
>>233
ネタだと思いたいが、仕事で他人のコードを見る機会が多いと、
>>217が可愛く見えるくらいの想像を絶するコードに度々遭遇する。
0236nobodyさん03/07/04 13:10ID:???
文字コード直接書くような糞コードよりはましだろ。。。
■ このスレッドは過去ログ倉庫に格納されています