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

Perlコーディング初心者質問スレ Part 52

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/09/15(金) 14:01:51ID:gobry0n2
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0124nobodyさん2006/09/23(土) 20:23:05ID:???
>>121
0x の接頭辞は、16進数である事を示す。
0x82 で16進数の82を指す。
0125nobodyさん2006/09/23(土) 20:24:48ID:???
貼るの忘れた
http://search.cpan.org/~dankogai/Encode-2.18/Encode.pm#Handling_Malformed_Data
0126nobodyさん2006/09/23(土) 20:43:33ID:???
まあ、いちいち変換→逆変換するのは無駄い気もするけどね。
01271212006/09/23(土) 21:39:58ID:???
>>124
サンクスです
0128nobodyさん2006/09/23(土) 21:39:59ID:???
PERL5ってこのスレでいいの?
0129nobodyさん2006/09/23(土) 21:49:51ID:???
>>123
あーEncodeって半端なマルチバイトを落としてくれるのか知らなんだ
入力された文字コードのチェックするしコストにはならないよね
0130nobodyさん2006/09/24(日) 00:58:20ID:???
Encode.pmはjcode.plよりも劣るから使ってない
jcodeにはutfパッチのやつとかあるしさ
0131nobodyさん2006/09/24(日) 01:07:12ID:???
>>130
凄い釣りですね^^
次はPerl5はPerl4より劣るから使ってないとか言い出すんですか?
0132nobodyさん2006/09/24(日) 01:15:21ID:???
ワロス
0133nobodyさん2006/09/24(日) 01:27:45ID:???
そんなエサに俺様がクマー
0134nobodyさん2006/09/24(日) 04:38:21ID:???
勉強になるなぁ。
0135nobodyさん2006/09/24(日) 04:47:31ID:???
釣りの?(´・ω・`)
0136nobodyさん2006/09/24(日) 05:19:33ID:???
=チラシの裏
最近 perl の
  my $this = shift or return;
  $hoge ||= 'hogehoge';
  $piyo &&= piyopiyo($piyo);
こういう書き方にエクスタシーを感じてきた。 if文いらないのステキすぎ。
=cut
0137nobodyさん2006/09/24(日) 05:33:37ID:???
おまいらPerlメモを知らないのか?
ttp://www.din.or.jp/~ohzaki/perl.htm
0138nobodyさん2006/09/24(日) 11:31:51ID:???
良くわからない正規表現使うよりは、
String::Multibyteモジュールを使ってみるのも。
use String::Multibyte;

my $str = "イリーガル\x82";
my $sjis = String::Multibyte->new('ShiftJIS');
print $sjis->islegal($str) ? 'true' : 'false';

ttp://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
も参考になる。
0139nobodyさん2006/09/25(月) 00:34:54ID:wf+gGDeG
21:00pmにc:\beta.exeを終了させるプログラムはどのようなソースになりますか?
0140nobodyさん2006/09/25(月) 01:22:59ID:???
>>139
>>1 ぐらい読め。
> 【投稿する際の注意】
> 質問するときは内容をよく吟味してから投稿してください。
> 「コマンドの意味がわかんない」とかはマニュアル見ましょう。
> 回答者さんは何でも屋じゃありません。
>
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
0141nobodyさん2006/09/25(月) 06:43:54ID:???
>>99,100
さんくすです。
0142nobodyさん2006/09/27(水) 10:30:04ID:???
ひさびさにPerlメモ見たら、

※上記の内容について
最近の perl(perl5.8.8等)では,index 関数を使うよりも, /\Q$keyword\E/ という正規表現を使った方が速いようです.実行速度は perl のバージョンや実行環境,スクリプト等に影響されるため,必要に応じてベンチマークをとるのがよいでしょう.

って書かれてた。7月下旬に更新されたらしい。
数年越しでも書き換えなきゃいけない情報をちゃんと更新するのは偉いなあ・・・。ちょっと遅いけど、まあGJ!
0143nobodyさん2006/09/27(水) 12:02:27ID:???
正規表現を使わないなら関数を使うより速いことが多い
0144nobodyさん2006/09/27(水) 16:45:21ID:???
日本語でおk
0145nobodyさん2006/09/27(水) 16:57:20ID:???
/\Qpenis\E/ ⇒ 正規表現なし ⇒ 高速
/^pen(?: )?is$/ ⇒ 正規表現あり ⇒ 低速

C言語のstrcmp()に置き換えできるような場合、Perlでは/〜/を使う方が速い
…とどこかのサイトに書いてあったがURLを紛失してしまった
0146nobodyさん2006/09/27(水) 17:13:22ID:???
でも誤差程度ならindexでいい気が。
0147nobodyさん2006/09/28(木) 08:51:24ID:???
@new_word_list = keys %new_bad_hash;
print "new_word = $new_word","\n";
print "last_bad_hash{new_word} = $last_bad_hash{$new_word}","\n";
とすると
$new_wordはちゃんと入っているのですが、ハッシュの値が表示されません。

@new_word_list = keys %new_bad_hash;を
@new_word_list = ("A","B","C");と直に書くとうまく表示されます。

printで表示すると両者ともA B Cと表示されます。
前者と後者の違いはなんだろうと思い、
chomp、=~ s/\s/ /g;をしてみたり、lengthで長さを確認してみたのですがいっこうに
違いがみいだせません。
この違いは何なんでしょうか?
0148nobodyさん2006/09/28(木) 08:55:20ID:???
すみません>>147の$new_wordは@new_word_listから適当にとってきたものです。
0149nobodyさん2006/09/28(木) 09:11:56ID:???
$new_word もそうだが、
%last_bad_hash は %new_bad_hash と関係あるのか >>147 じゃわからないんだがw
情報小出しにしないで、自分で質問文読んで理解できるように書いてね・・・
0150nobodyさん2006/09/28(木) 09:28:43ID:???
えと、%last_bad_hash は %new_bad_hashとキー($new_word)が同じハッシュで、
%new_bad_hashからキーを取り出して$last_bad_hashのハッシュ値を得ようとしています。

しばらくいじってたんですが、
キーが全部アルファベットだとうまくいくみたいです。
日本語だと前者はダメで、直に書いた後者は大丈夫でした。
0151nobodyさん2006/09/28(木) 12:32:45ID:???
>>147
整理すると、
$new_word の値は、%last_bad_hash のキーであるはずなのに、$last_bad_hash{$new_word} の値が表示されないのですね。
%last_bad_hash のキーの中に $new_word の値が存在しないからそのような現象が起きるので、$new_word の値と、
%last_bad_hash のキーをすべて表示させてみてはいかがですか。値の中にスペースが入っているということはないんですか?
2バイト文字の場合文字コードの問題もありますよ。
print unpack("H*", $new_word);
print unpack("H*", join(",", keys %last_bad_hash));
とでもやって値を比較してはどうですか。
0152nobodyさん2006/09/28(木) 13:43:21ID:???
文字コードの問題でした。。。。EUCとJISが混在してました。
すみません。ありがとうございます。
0153nobodyさん2006/09/28(木) 17:27:09ID:???
はじめまして。
スレ違いでしたら、申し訳ありません。

社内で使用するために、掲示板を設置する作業を請け負いました。
フリーの添付ファイルアップロード機能付きの掲示板を設置したのですが、
添付ファイル名に日本語が使用したいという希望により、
レス番などを用いたユニークなファイル名に変換して、
サーバーへ保存する改造を行いました。
すると、ダウンロードする際に名前が変わってしまうので(当たり前ですよね;)
どうにかならないかとの希望が出て、どうすればいいか迷っています。

コメント文を保存しているファイルには、
『添付ファイルの元の名前』『サーバー保存用に変換している名前』も書き出しています。

添付ファイルのダウンロードは、単純に<a></a>で直接ファイル名を指定しております。
ダウンロードの際に、元のファイル名に変換するという事が出来るのでしょうか?
また他に何かいい方法があれば、お知恵を貸していただきたいのですが。
よろしくお願いします。
0154nobodyさん2006/09/28(木) 17:40:49ID:???
> また他に何かいい方法があれば、お知恵を貸していただきたいのですが。
> よろしくお願いします。

御社の出入り業者に発注すればよろしいのではないかと。
0155nobodyさん2006/09/28(木) 18:04:21ID:???
>>153
できるよ。
ファイル名に変換するんじゃなく、保存するときのデフォルトのファイル名を変えるってだけだけど。
0156nobodyさん2006/09/28(木) 18:09:05ID:???
簡単に言うとこうか
print "Content-Disposition: attachment; filename=\"$filename\"\n";
くわしくは ↑ でぐぐって。
0157nobodyさん2006/09/28(木) 18:31:39ID:???
日本語ファイル名だとさらにひとひねり必要だが、↑をぐぐってよく調べれば
その辺もわかるだろう。
0158nobodyさん2006/09/28(木) 18:58:11ID:???
http://www.google.com/search?num=75&hl=ja&rls=ja&q=Content-Disposition+attachment+filename&lr=lang_ja

なんか、ややこしいね
0159nobodyさん2006/09/28(木) 19:03:19ID:???
>>154-158
レスありがとうございます。
頭こんがらまくりですが、がんばって調べてみます。
でも多分、私なぞの頭では無理そうなので、
「出来ません!」と開き直る率高しです。(;´Д`)

>>154さんのご指摘の通り、
こんなHP担当もどきに頼まず、ケチってないで外注さんに依頼しろ!って感じです。
グチってもしかたないですがw

ありがとうございました!
0160nobodyさん2006/09/28(木) 21:27:50ID:???
> でも多分、私なぞの頭では無理そうなので、
> 「出来ません!」と開き直る率高しです。(;´Д`)

坊や頭大丈夫かい?
0161nobodyさん2006/09/28(木) 23:16:37ID:???
>>160
ああああ ごめんなさい。
書き方悪かったですね。
私に依頼してきた、社内の人にです。
私には分不相応ですので、ファイル名には気をつけてくださいと伝えるつもりです。
教えてくださった事は、勉強しています。
0162nobodyさん2006/09/29(金) 00:22:15ID:CoNVbZUT
$HOUSYUGAKU = "-892-4305-2940";
$KOSUU = "-4-1-2";
$GOUKEI_HOUSYUGAKU = "-3568-4305-5880";
$SYOHIN_CODE = "-CODEA-CODEB-CODEC";

@housygaku_list = split(/\-/,$HOUSYUGAKU);
@kosuu_list = split(/\-/,$KOSUU);
@goukei_housygaku_list = split(/\-/,$GOUKEI_HOUSYUGAKU);
@syohin_code_list = split(/\-/,$SYOHIN_CODE);

for($i = 0; $i < @housygaku_list; $i++) {
$TOTAL .= "&si=" . $housygaku_list[$i] . "." . $kosuu_list[$i] . "." . $goukei_housygaku_list[$i] . "." . $syohin_code_list[$i];
}

として、$TOTALの値を&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC
としたいのですが、&si=...&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC
となってしまいます。

どのようにすれば問題解消するでしょうか?
ご教授お願いします。
0163nobodyさん2006/09/29(金) 00:24:23ID:???
自宅サーバ板で聞いたら鯖関係なかったみたいなので
こちらで質問します

↓これ自分です
948 名前:DNS未登録さん :2006/09/26(火) 20:33:39 ID:szdp6kC6
質問です。ググッたけど分かんなかったです
環境はWinXP Home SP2 apache1.3.27

画像をアップロードして掲示板から参照するCGIを
作ったんですが、日本語ファイル名をSJISで
アクセスしようとすると、FORBIDDENになります

例えば
猫.jpgにhttp://%94L%2ejpgでアクセスできない
あ.jpgにはできる

ログを見ると罵.jpgにアクセスしようとしています
罵.jpgは%94l%2ejpgなので、SJISの2バイト目のL大文字がl小文字になってる事が
原因だと思うんですが、何か解決策はないでしょうか?

もしやWindowsが大文字と小文字区別しないから無理、とかですか?

どなたかお願いします


いただいたレスでLを%4Cにすればイイとあったんで
$filename =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$filename =~ s/([A-Z])/'%' . unpack('H2', $1)/eg;
↑の様にして見ましたが結局%94%4c%2ejpgでアクセスしても
Apacheのエラーログに罵.jpgにアクセスしていると書かれます

これってこういうものなんでしょうか?
0164nobodyさん2006/09/29(金) 01:06:10ID:???
HTML に URL エンコードされた文字列を書くんじゃなくて、直接日本語ファイル名を HREF に書いてみ
01651632006/09/29(金) 01:24:30ID:???
レスありがとうです
猫.jpgにアクセスしてみたんですが同じでした

エラーログも
(2)No such file or directory: file permissions deny server access:
と出るのが気になります。なんでパーミッションエラー?
ファイル名が違うのなら404だと思うんですが…
0166nobodyさん2006/09/29(金) 06:55:52ID:???
うちの IEタン と Fxタン では %94L.txt 、 %94l.txt 両方とも普通に判別してできたけど?
何が違うんだろうねえ。
windows でも、たとえば 猫.txt と 罵.txt は同じフォルダに共存できてるので、そのせいじゃないっぽい気がするけどね。
もしかしたらブラウザのせいかもしれないよ。
0167nobodyさん2006/09/29(金) 10:12:37ID:???
向こうでも見たけど、普通にアクセス権がないだけとかじゃねーかよ。
0168nobodyさん2006/09/29(金) 10:44:20ID:???
あるあるwww
0169nobodyさん2006/09/29(金) 13:34:48ID:???
まじかよw
「Apacheのエラーログに罵.jpgにアクセスしていると書かれます」
が全てにおいてなってるって信じてそれは除外してたのにw
0170ソケット2006/09/30(土) 01:35:35ID:jL8SsxbP
次のコードでソケットが生成できないです。ヒントでも欲しい。。。
どうもサーバの問題な気もするけど。。。
$proto = getprotobyname('tcp');
unless($iaddr = Socket::inet_aton($host)){return;}
$sock_addr = Socket::sockaddr_in($port, $iaddr);
unless(socket(SOCKET, Socket::PF_INET, Socket::SOCK_STREAM, $proto)) {
print "error"; return;
}

でerrorになります。スクリプトはコピペじゃなくて手書きなので、
万一誤記があったら申し訳ありません。
ただし、問題のコードは別のレンタルサーバで動いていたので、
実機に誤記はないはずなんです。
$hostはlocalhostです。

環境:fedora core4 perl5.8
0171nobodyさん2006/09/30(土) 01:41:09ID:???
>>170
とりあえず、情報が少なすぎるので氏ね
0172ソケット2006/09/30(土) 01:51:07ID:jL8SsxbP
申し訳御座いませんでした。
perlのバージョン:5.8
インストールされているライブラリは多くて書き込めないのですが、
fedora core 4 の「サーバインストールモード」でインストールして、
その後sendmail-cf、qpopper、gccをrpmで入れました。

すみません。他にどんな情報が必要なのかが。。。
サーバ関係の板かな?
0173nobodyさん2006/09/30(土) 01:55:43ID:???
そんな断片的なコードで動く動かないと言われても、
誰も答えることができないよという意味。

ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。

最小のテストコードで試して何が悪いか追求しましょう。
0174ソケット2006/09/30(土) 03:31:10ID:???
不快な思いをさせまして、すみませんでした。
追求してみます。
0175nobodyさん2006/09/30(土) 08:18:25ID:???
>ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。
例えが素晴らしい
01761632006/09/30(土) 13:43:31ID:???
>>167-169
レスありがとうです

猫.jpgと 罵.jpgを同じフォルダに置いて
http ://%94%4c%2ejpgにアクセスすると罵.jpgが表示されます
しかもその際他の画像よりロードが長いです
また、http ://猫.jpgでも罵.jpgが表示できました

%94%4c%2ejpg→%94L%2ejpg→%94l%2ejpg→罵.jpg
こういう流れなのでしょうか…?
0177nobodyさん2006/09/30(土) 16:11:26ID:???
>>176
mod_encoding
スレ違い
0178nobodyさん2006/10/01(日) 12:28:14ID:???
正規表現に、ー(長音記号)を使うにはどうしたら
いいのでしょうか?
0179nobodyさん2006/10/01(日) 12:58:10ID:???
???
0180nobodyさん2006/10/01(日) 14:00:28ID:???
>178
日本語でおk
01811782006/10/01(日) 17:57:37ID:???
すみません。

perlのCGIでhtmlファイルを標準出力に出力しようとしています。
それでhtmlのformのvalueに「カラー」と入れています。
そしてCGI側で変数に
$color = "カラー";
としていて、$colorとマッチした行を書き換えたいのです。

それで
$line =~ s/$color/xxxxx/;
と書いているのですが、
htmlファイルが上手く出力されません。

この行をコメントアウトするとhtmlがすべて出力されるので
この行に問題があるようなのです。

0182nobodyさん2006/10/01(日) 18:08:31ID:???
>>181
「カラー」が「color」ならうまくいきません?
それでうまくいったら文字コードの関係でしょう。
0183nobodyさん2006/10/01(日) 20:28:54ID:???
$color = quotemeta $color;
あるいは
$line =~ s/\Q$color\E/xxxxx/;
0184nobodyさん2006/10/01(日) 21:19:06ID:???
俺も初心者だけど。。。

Shift-JISだと、”ー”の第2バイトが”[”ってことかな〜?
後々の事を考えると、EUCかUTF-8がいいかもね。

use encoding "shiftjis";
0185nobodyさん2006/10/01(日) 21:56:19ID:???
use encoding なんか薦めないでくれwww
0186nobodyさん2006/10/01(日) 21:57:04ID:???
>>184
初心者に不用意に encoding.pm を教えるなよ。
0187nobodyさん2006/10/01(日) 22:17:27ID:???
encoding って負の遺産だろ・・・
0188nobodyさん2006/10/01(日) 22:32:53ID:???
さんざんでわろたw
01891782006/10/01(日) 22:43:04ID:???
みなさんアドバイスありがとうございます。
ということは>>183さんのやり方がいいのでしょうか?
明日試してみます。ありがとうございました。
01901632006/10/02(月) 00:08:50ID:???
>>177
遅れましたがレスありがd
ちょっと調べたんですが、Windows版のApache1.3用mod_encodingって
もしかして無いんでしょうか?

自分でビルドするしかないって事になるのでしょうか

あ、自宅サバ行った方がいいかな
0191nobodyさん2006/10/02(月) 18:06:42ID:NJMhk9xt
ASCIIコードを文字に変換するのってどうすんの?
"\x20"→" "みたいな感じ
0192nobodyさん2006/10/02(月) 18:12:31ID:???
perl -e 'print +( chr( "¥x20")) . "¥n"'
0193nobodyさん2006/10/02(月) 18:14:51ID:???
おおまちがい orz...
0194nobodyさん2006/10/02(月) 18:54:08ID:???
ハッシュのアドレスを使ってそのアドレス先のハッシュのキーを取り出すことは可能ですか?
$ref_hashがハッシュのリファレンスだとすると
keysはハッシュしか受け付けてくれないので、
$ref_hashからハッシュを復元(?)してkeysで取り出したりできないだろうかと
思っているのですが
0195nobodyさん2006/10/02(月) 18:56:59ID:???
01961942006/10/02(月) 19:03:04ID:???
あるハッシュへのアドレスがあって、そのアドレスが$ref_hashです。
それで、そのハッシュのキー値がしりたいのですが、
無名ハッシュなので、なんとかしてアドレスからわからないだろうかと・・・
0197nobodyさん2006/10/02(月) 19:15:47ID:????BRZ(1100)
デリファレンスってどうやんだっけ?
0198nobodyさん2006/10/02(月) 19:26:18ID:???
$ref_hashがハッシュのリファレンスなら

keys %$ref_hash

だがアドレスといっているので何か違う世界の話かもしれないな...



0199nobodyさん2006/10/02(月) 19:41:16ID:???
リファレンスを文字列にすると、"型(アドレス)" が得られるけど、このアドレスの事?
perl -e "print [123];" → ARRAY(0x123456)


まあリファレンスの事だろうけど
0200nobodyさん2006/10/02(月) 19:46:10ID:???
encoding って使うとまずのですか?
02011942006/10/02(月) 20:01:46ID:???
いやリファレンスのことです。。。
すみません、ありがとうございました。
0202nobodyさん2006/10/02(月) 21:02:26ID:???
>>200
まずくありません。よく知られた罠があり、使う場面を選ぶというだけです。しかしそのため、

「よくわからないけれどとにかく動くようにしたい人」に勧めると、二日ほど経ってから「今度は思わぬところがアッー! で困っています」と泣き付かれるかもしれず、
「プログラムやライブラリを配布して社会に貢献したい人」に勧めると、膨大な数の配布先が use encoding の罠に汚染されてしまうかもしれず、
「夢と希望と探究心に溢れた初心者」に勧めると、貴重な学習曲線の序盤でつまらない無駄足を踏ませてしまうかもしれず、

などの事情で大抵は勧めにくいということです。
適切な使いどころがわからないなら使わないほうが無難でしょう。
0203nobodyさん2006/10/02(月) 21:30:58ID:kJiDkda9
すみません、他スレから誘導されてきました。

ホスト名が検索できない海外の串からのアクセスが多くて困っています。
そこでそのようなアクセスを弾くようにするにはどのような手を加えたらよいでしょうか?
良く見かける言葉では
・ホスト名が無い時に弾く
・逆引きできないホストからのアクセス禁止
のようになるとおもいます。

難しい事は分からないので出来るだけ簡単に何かないでしょうか?
よろしくお願いします。
0204nobodyさん2006/10/02(月) 22:16:03ID:???
>>202
ありがとう。
よく知られた罠とは何でしょうか?
少しググって見ましたが、こんな感じのやつしょうか?

Allen's diary(2005-04)
http://www.tokimeki.st/diary/?date=200504

Perlで何だか妙なエラーが出て悩まされた件について。
具体的には、"Wide character in subroutine entry"って何やねんっ!と悩んでたけど、
よくよく考えたら

use encoding "shift-jis"してるから標準入力から取り込んだ文字列は既にUnicodeに
なってるというのに、わざわざEncode::from_to($str, "shiftjis", "euc-jp");とかやってた

複数ファイルへのリダイレクトのために標準出力を一旦閉じて開きなおす際に文字コードを
指定しなおしてなかった(出力はeuc-jpだけど、use encoding "shift-jis", STDOUT=>'euc-jp';で
満足してた)という二重障害が原因と判明。慣れないことをするからこんな恥ずかしいバグが
出るんだよ_| ̄|○
0205nobodyさん2006/10/02(月) 22:33:23ID:???
>>203
それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?

自分でやるなら、$ENV{REMOTE_ADDR} と $ENV{REMOTE_HOST} 、
それに gethostbyaddr や gethostbyname でぐぐってみていろいろ自分で考えて、
それでもわからなかったら聞きにおいで。

>>204
そのひと、いろんな意味で何やってるのかわからんねw
0206nobodyさん2006/10/02(月) 22:37:55ID:???
>>204
概ねそれです。しかし実際にはもっと大きな罠です。
「use encoding の効果は use encoding されたプロセスの I/O 全てに効いてくる」というのがその理由です。
つまり自分だけでなく、他人の書いたコードの "use encoding" safe を気にしなければなりません。
use や require で読込まれたコードがそれっぽい処理をしているとアウトですから。

そんなのイヤでしょ?
0207nobodyさん2006/10/02(月) 22:50:41ID:???
>>206
ああ、なるほど。
納得しました。
サンクスです。
02082032006/10/02(月) 23:49:15ID:???
>>205
>それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?
配布している所があれば是非活用したいですのでもしあれば教えていただけませんか?
0209nobodyさん2006/10/03(火) 00:37:08ID:???
>>208
スレ違いなのでどちらかへ ∩( ´∀`)∩ドウゾ (っ´∀`)っ))ヨロシク

【CGI】こんなCGI探してますver.21
http://pc8.2ch.net/test/read.cgi/hp/1154177468/

ご希望のCGIを作成いたします
http://pc8.2ch.net/test/read.cgi/php/1145308869/
0210nobodyさん2006/10/04(水) 12:12:04ID:zNjB8ynb
どうにもうまく行かないバグが発生しており、自分では原因が分からないところまで来てしまったので質問させて下さい。
自分のはてなブックマークからRSSを取得して、ブックマークしているURLを抽出→そのURL(合計30件)をブックマークしている全てのユーザーを抽出→上位を表示というスクリプトを組んだのですが特定のURLからユーザー情報を抽出出来ないバグが発生しています。
少し長いのですが以下にコードを載せます。
0211nobodyさん2006/10/04(水) 12:13:19ID:zNjB8ynb
#!/usr/bin/perl

use LWP::Simple;

$base = get('http://b.hatena.ne.jp/Marathon/
rss'); #ここのMarathon部分を自分のユーザーIDに変更
@splited_base = split /\n/, $base;

foreach $i (@splited_base) {
if ($i =~ m|a href="http://
b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('http://
b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}
#続く
0212nobodyさん2006/10/04(水) 12:14:47ID:zNjB8ynb
#続き
foreach $i (@splited_rss) {
if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA-
Z0-9])</title>|) {
push (@fav_user_list, $1);
}
}

foreach $i (sort { $a cmp $b } @fav_user_list) {
if ($i eq $prev) {
$per++;
} else {
push (@sorted_favlist,
($per*3.33)."%\t$prev");
$prev = $i;
$per = 1;
}
}

push (@sorted_favlist, ($per*3.33)."%\t$prev");

foreach $i (sort { $b <=> $a } @sorted_favlist) {
print "$i\n";
if ($j == 10) {
last;
} else {
$j++;
}
}
exit;
0213210-2122006/10/04(水) 12:20:38ID:t51HyLJW
何故か>>211-212に挙げたスクリプトでは

http://b.hatena.ne.jp/entry/rss/http://capsctrl.que.jp/kdmsnr/wiki/bliki/?cmd=view&p=UmlAsSketch&key=%A5%B9%A5%B1%A5%C3%A5%C1

に含まれている、<title>ユーザーID</title>の情報が抽出出来ないのです。

上のURLは自分のブックマークのRSSか正常に抽出されたもので、個別にget()してから<title>ユーザーID</title>の抽出を行うと問題なくユーザーIDの抽出が行えます。

現状、個別に抽出出来る状態にも関わらず、それをループさせると問題が出るという状況に陥っています。

原因がお分かりになる方、ご助言頂ければ幸いです。
0214nobodyさん2006/10/04(水) 12:56:10ID:???
>個別に抽出出来る状態にも関わらず、それをループさせると問題が出る

じゃあループに問題があるのでは?
読んでないけどww
0215nobodyさん2006/10/04(水) 13:59:04ID:???
これだけ長いといちいち追いかける気もしないので、途中結果を確認して
おかしい所を特定してから示してくれ。
0216nobodyさん2006/10/04(水) 16:14:40ID:mTQmplV+
>>214-215
恐らく↓のルーチンでget出来ていないか
foreach $i (@splited_base) {
if ($i =~ m|a href="http://
b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('http://
b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}

↓のルーチンで抽出が出来ていないか
foreach $i (@splited_rss) {
if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA-
Z0-9])</title>|) {
push (@fav_user_list, $1);
}
}
のどちらかが問題だと考えています
0217nobodyさん2006/10/04(水) 16:18:48ID:???
ただ、上のルーチンで応答コードを返させると全て200が返ってくるので連続取得で弾かれてる線は薄いんじゃないかんと自分では考えています。

下のルーチンは問題の有るURLを個別にgetしてから入れると問題なくユーザーIDを抽出してきます。

そうすると、上のルーチンも下のルーチンも正常に動作していることになり、原因が存在しないことになってしまっているのが現状です

長いコードを貼り付けて申し訳ありませんでした。
0218nobodyさん2006/10/04(水) 16:51:57ID:???
だからお前がどう勝手に思い込んでるかはどうでもよくて、、変数の値が期待してる通りになってるか
ちゃんと表示させて追いかけろと....
0219nobodyさん2006/10/04(水) 18:01:45ID:8AfjfVrQ
>>218
試してみます
ありがとうございました
0220nobodyさん2006/10/04(水) 18:53:53ID:XYwup9WL
素人:perlってどうやってデバッグやんの

プロ:間接的には可能ですが厳密なデバッグはできません。仕様外です。w
0221nobodyさん2006/10/04(水) 20:30:23ID:???
わざわざスクレイピングせずに XML::RSS とかCPANモジュール使えば?

#!/usr/bin/perl
use LWP::Simple;
use XML::RSS;

my $hatena_id = "Marathon";

my $rss = new XML::RSS;
$rss->parse( get("http://b.hatena.ne.jp/$hatena_id/rss";) );
my $items = $rss->{items};

my %count;
for my $item (@$items) {
  my $item_rss = new XML::RSS;
  $item_rss->parse( get("http://b.hatena.ne.jp/entry/rss/$item->;{link}") );
  $count{ $_->{title} }++ for (@{ $item_rss->{items} });
}

my @ranking = sort { $count{$b} <=> $count{$a} } keys %count;
for my $user (splice @ranking, 0, 10) {
  my $per = $count{$user} / @$items * 100;
  printf "%.2f%%\t%s\n", $per, $user;
}
02221782006/10/04(水) 20:49:29ID:???
正規表現で変数を使う際に、その変数の中に長音記号が入っている場合
についてお聞きします。
作っているCGIの内容というのは
入力画面→確認画面→登録完了画面という流れになっています。

入力画面ではラジオボタンで参加したいセミナーを選択します。
<INPUT type="radio" name="xxx" value="セミナー1">
<INPUT type="radio" name="xxx" value="セミナー2">
というようになっています。

そして確認画面に<!--xxx-->と記述しておき
valueの値と置換して選択したセミナーを表示するという処理を
行いたいのです。

CGIに下の記述をしています。

$seminar1 = "セミナー1";
$seminar2 = "セミナー2";

$seminar1 = quotemeta($seminar1);
$seminar2 = quotemeta($seminar2);

quotemetaを行っているので
value="\セ\ソ~\ナ\―[\2"
というふうになってしまい、

確認画面に「セミナー2」と表示できずに
「\セ\ソ~\ナ\―[\2」と表示されてしまいます。

何かいい方法ありませんでしょうか?

わかりづらかったらすみません。
0223nobodyさん2006/10/04(水) 20:56:06ID:???
>>222
/\Q$seminar1\E/ とすれば quotemeta は必要ない

生で表示すると、パラメータとして xxx=<script>alert("Hello")</script> を渡したりしても大丈夫?
てか、テンプレートエンジン使おうよ...
■ このスレッドは過去ログ倉庫に格納されています