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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/02/16(月) 11:42:29ID:gvPTpodw
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0377nobodyさん2009/05/02(土) 12:08:08ID:???
配列に対してフィルタというと、普通にgrepだなあ
0378nobodyさん2009/05/02(土) 12:44:54ID:???
全くデバッグしていないのがスゴイ
03793742009/05/02(土) 12:47:26ID:???
>>375
ありがとうございます
そのとおりやってみたら、見事に$erase以外がログに書き込まれていました。
おっしゃる通り、改行が含まれていたせいみたいです。

しかし、修正されたログにも同じように数字ごとに改行を含んでおきたいのですが、
この処理だと

119049025

のように改行なしで一気に書かれてしまいました。

そこで、元の自分の書いたものに>>376さんのアドバイスで修正を加え

chomp @datalist;
for ( my $k = 0 ; $k < @datalist ; $k++ ) {
if ( $datalist[$k] ne $erase ) {
push(@newlist, "$datalist[$k]\n");
}
}

としてみると、一応、望み通りの結果を出すことができました。
二晩くらい悩みまくったので、とても助かりました。
ほんとうにありがとうございました。

grepを使った方法は今まで使ったことが無くて、一行で処理できる
美しいコードに感激したので、もしよろしければ自分の書いた方法以外で
同じ結果の出せる(改行含む)書き方があれば教えてやってください。
0380nobodyさん2009/05/02(土) 15:42:19ID:???
>>379
map { s/$erase\n//; } @datalist;
0381nobodyさん2009/05/02(土) 16:15:37ID:???
>>380
それは部分一致だからs/^\Q$erase\E$//
0382nobodyさん2009/05/02(土) 17:09:01ID:???
^\Q$erase\E\n$
0383nobodyさん2009/05/02(土) 17:44:55ID:???
でも、リストを作る時に改行は外した方が
0384nobodyさん2009/05/02(土) 18:10:31ID:???
$は改行にマッチするので¥nは不要
03853842009/05/02(土) 18:15:58ID:???
と思ったが、要るか
03863742009/05/02(土) 18:37:39ID:???
みなさんありがとうございます

map { s/^\Q$erasedat\E\n$//; } @datalist;

で希望通りに処理されるのを確認できました。

mapとかgrepというのを使いこなせば、いま自分の書いてる現行のスクリプトで
改善できるところがすごく多そうなので、ちょっと勉強してみます。。

ほんとに助かりました。親切にありがとうございました
03873742009/05/02(土) 18:39:02ID:???
$erasedatではなくて$eraseでした
0388nobodyさん2009/05/02(土) 19:51:16ID:???
mapの結果は要素数同じでヌルがいっぱい入ってないか?
0389nobodyさん2009/05/02(土) 21:04:48ID:???
ヌルはないがぬるぽがいっぱいだお
0390 ◆TWARamEjuA 2009/05/03(日) 09:41:50ID:????BRZ(10072)
ヌコはいないがガッがいっぱいだお
0391nobodyさん2009/05/05(火) 04:15:46ID:???
やっぱmapとgrepそして正規表現を使いまくってこそperlと言う気がするな
0392nobodyさん2009/05/05(火) 10:06:17ID:???
あと pack と unpack ね
0393nobodyさん2009/05/05(火) 13:43:50ID:???
そして数日後自分でも読めなくなると。
0394nobodyさん2009/05/05(火) 14:21:29ID:???
コメントがちゃんと書かれているなら、まあいいかなという気がする
0395nobodyさん2009/05/06(水) 01:57:30ID:???
splitとgrepとsortとforが一行で並んでる感じ
0396nobodyさん2009/05/06(水) 08:18:31ID:???
とあるサイトの中にある自分のステータス情報を
LWP::UserAgent を使って取得したいんですが、
リンクを幾つかたどっていく必要があります。

cookie は何とかなったんですが、
1つ前の html ファイルにあるパラメータを取得して POST メソッド時に引き渡すところの
解析に手を焼いています。
# パラメータ名は判っているので現在は文字列検索で取得しています。

a href などではなく、POST メソッドのパラメータも解析してくれる
便利なパッケージって無いでしょうか
0397nobodyさん2009/05/06(水) 11:03:19ID:???
配列をサブルーチンに渡すときって
&sub (@hoge);
ではダメなんでしょうか?

この記述で渡して、受け取ったサブルーチン側でログに書きだしたら
各行に空白が入るようになってしまったんですが。。。
0398nobodyさん2009/05/06(水) 11:35:46ID:???
配列に元々改行コード入ってるんじゃない?
0399nobodyさん2009/05/06(水) 11:50:51ID:Ms7+WRwl
>>397
もともとの値がちゃんと期待通りの値か確認してみ
他の可能性としては
my(@args);
としてるだけで
@args = @_;
みたいにするの忘れててサブルーチン側でちゃんと受け取ってないとか
0400nobodyさん2009/05/06(水) 13:42:27ID:???
>>396
HTML::Form(LWPの付属モジュール)
WWW::Mechanize(LWPのスーパークラス的なモジュール)
04013962009/05/06(水) 17:22:28ID:???
>>400 情報dくす。ググって調べてみる。 いい感じに逝きたい、これ試してみて。
0402nobodyさん2009/05/06(水) 17:46:16ID:???
>>401
わざわざぐぐらなくても、pod 読めばいいと思う。
0403nobodyさん2009/05/06(水) 18:05:57ID:???
>>400
> WWW::Mechanize(LWPのスーパークラス的なモジュール)

04043972009/05/06(水) 19:32:33ID:???
>>398
同じルーチンの中でやると普通に綺麗に書き出されるんだけど
別のサブルーチンに引き渡すと、データそのままで、各行の頭に半角空白が1個ずつ挿入されてる、って感じです。

>>399
&sub (@hoge);
で渡して、受け取る側で
@data = $_[0];
と書いてます。
0405nobodyさん2009/05/06(水) 19:53:17ID:???
>>404
@data = @_;
0406nobodyさん2009/05/06(水) 21:07:16ID:???
つか配列のリファレンス渡せ
0407nobodyさん2009/05/06(水) 21:09:34ID:???
>>404
とりあえず周辺のソースを晒してみたら?
0408nobodyさん2009/05/06(水) 21:33:27ID:???
先物で現受けする時に倉荷証券で受け取るのって参照渡しだよな
0409nobodyさん2009/05/06(水) 23:48:47ID:???
>>400
簡単なスクリプト作ってみたらイイ感じに出来た。
無事思惑通りのことができそう。
今まで URL を解析して UserAgent で get していたのが楽になる (T-T)
0410nobodyさん2009/05/07(木) 04:36:51ID:???
次はWeb::Scraperとの組み合わせを覚えてもいいかもな
>>396の用途ならピッタリだと思うぜ
0411nobodyさん2009/05/07(木) 12:48:09ID:???
htmlがきちっとしてれば、そんな苦労は要らんという気もする
0412キュウティイハニ-2009/05/07(木) 17:35:14ID:EGaRRr78
以下のようにあるWEBページを取得しようとしています。

use LWP::Simple;

getstore('http://www.yahoo.co.jp','d:\\test\\nikki.tmp2');

しかし、上記のyahooの場合は全てが取得されますが、
サイズの大きいサイトでは途中まで切れてしまいます。
(サイズの大きいサイトのサンプルが具体的に言えません、すみません)
サイズは128kBくらいまでなら、取得できるようです。
取得サイズを指定する何かがあるのでしょうか?
0413nobodyさん2009/05/07(木) 18:57:38ID:???
use LWP::Simple;
getstore('http://d.hatena.ne.jp/diarylist?mode=lirs','./lirs.dat');

> dir lirs.dat
2009/05/07 18:56 57,602,778 lirs.dat
1 File(s) 57,602,778 bytes


?
0414キュウティイハニ-2009/05/07(木) 20:20:10ID:EGaRRr78
>>413
回答ありがとうございます。
ためしためしで先程からテストしていたんですが、
どうも、対象のサイトに依存するようです。。。
0415nobodyさん2009/05/07(木) 21:00:25ID:???
タイムアウトでもしてんじゃねえのかね
そちらの環境で同様の現象が起こるサイトが出せない限り、これ以上は無理だね
0416nobodyさん2009/05/07(木) 21:40:07ID:???
UAをちゃんと設定してみそみそ
0417キュウティイハニ-2009/05/07(木) 21:47:42ID:EGaRRr78
>>415-416

あるアクセス解析のページなんですが、
IEでソース表示を行った場合も、
同様の場所で、ソースが切れています。
ブラウザ上では切れていなく表示されているのに。
なんで???
0418nobodyさん2009/05/07(木) 22:02:57ID:???
こちらへどうぞ
ttp://sakura_editor.at.infoseek.co.jp/
0419nobodyさん2009/05/07(木) 22:03:41ID:???
ついでにこれも
ttp://www2a.biglobe.ne.jp/~qpon/html/ie_edit.htm
0420キュウティイハニ-2009/05/08(金) 16:41:50ID:CAAVVdSZ
>>416

こんな感じでもダメでした。。。

use LWP::UserAgent;

$ua = LWP::UserAgent->new;
$ua->timeout(30);
$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
$req = HTTP::Request->new(GET => $kw_url);
$res = $ua->request($req);
$status = $res->status_line;
$content = $res->content;
0421キュウティイハニ-2009/05/08(金) 16:42:32ID:CAAVVdSZ
>>418-419

自動的にプログラムで取得してファイルに書きたいのです。
0422nobodyさん2009/05/08(金) 16:44:17ID:???
こうしたら?
$ua->timeout(3000000000000000000000000000000000すげえ);
0423nobodyさん2009/05/08(金) 16:49:19ID:???
128KB を越えるページを教えてください
テストしてみたい
0424キュウティイハニ-2009/05/08(金) 17:05:05ID:CAAVVdSZ
>>423
具体的に教えられないんです。
i2iアクセス解析のサーチワード一覧のソースが欲しいんです。

一例ですが、以下のようにget出来ますが、4番目の"q=%00"が出てくると、
ソースがちょん切られるみたいです。(※のところに[EOF]がくる)

<td align="right">3</td>
<td><a href=http://www.google.co.jp/search?hl=ja&q=BOSS&lr= target=_blank>BOSS</a></td>
<td align="right">4</td>
</tr>
<tr>
<td align="right">4</td>
<td><a href=http://www.google.co.jp/search?hl=ja&q=%00&lr= target=_blank>※
0425nobodyさん2009/05/08(金) 17:08:59ID:???
それじゃぁもう無理だ
てめーで解決しろよ
0426キュウティイハニ-2009/05/08(金) 17:11:45ID:CAAVVdSZ
他の日も試してみましたが、クエリーストリングに%00が含まれていると、
そこで、切られるみたいです。
でも、ブラウザ(IE8)上では、切れていないんです。
0427キュウティイハニ-2009/05/08(金) 17:12:10ID:CAAVVdSZ
>>425
冷たいなぁ。。。
0428キュウティイハニ-2009/05/08(金) 17:13:41ID:CAAVVdSZ
apacheのログを舐めて、リファラー部分を集計するようなperlライブラリってないですかね?
0429nobodyさん2009/05/08(金) 17:20:09ID:???
それぐらい自力で組めるだろw
0430キュウティイハニ-2009/05/08(金) 17:27:31ID:CAAVVdSZ
>>429
顕著な検索エンジンを経由してきた検索語と回数をカウントしたいんですが、簡単なんですか?
0431nobodyさん2009/05/08(金) 17:36:41ID:???
>>428
「死ぬほどある」に1票
0432キュウティイハニ-2009/05/08(金) 17:39:56ID:CAAVVdSZ
>>431
死ぬほどないんですけど><
http://www.google.co.jp/search?hl=ja&q=apache+referer+%E9%9B%86%E8%A8%88+%E6%A4%9C%E7%B4%A2%E8%AA%9E+perl&btnG=%E6%A4%9C%E7%B4%A2&lr=
0433nobodyさん2009/05/08(金) 18:01:07ID:???
死ぬほど絞るからでしょう。
q=apache+log+perl

\0 でつまずいてるようだから今後も苦労すると思う。
0434キュウティイハニ-2009/05/08(金) 18:15:10ID:CAAVVdSZ
私、馬鹿なんだな。。。
よくわからない。

apacheのログを入力として、
検索語(日本語)とその検索回数を
表示してくれるだけでいいのに。
0435nobodyさん2009/05/08(金) 18:20:44ID:???
それのどこにリファラーが関係あるのさ
0436キュウティイハニ-2009/05/08(金) 18:21:55ID:CAAVVdSZ
%00はどういう意味なんだろう?
0437キュウティイハニ-2009/05/08(金) 18:24:51ID:CAAVVdSZ
>>435
リファラーにq="なんたら"
って書いてある"なんたら"の
"なんたら"と、その回数が知りたいのです
0438nobodyさん2009/05/08(金) 18:37:21ID:/tMyodOD
検索語からして馬鹿を露呈してると思うよ。
>>432から"検索語"を抜いた"apache referer 集計 perl"でググっただけで死ぬほど出てくるというのに。
0439nobodyさん2009/05/08(金) 18:38:33ID:/tMyodOD
リファラ集計
open IN, '<', '/apache/logs/access.log';
my%ref_cnt;foreach my$log(<IN>){$log=~m/^.*? .*? .*?\[.*?\] ".*?" [0-9]{3} .+ "(.*?)" ".*?"/;$ref_cnt{$1}++;}
my@keys=sort{$ref_cnt{$b}<=>$ref_cnt{$a}}keys%ref_cnt;for my$key(@keys){print$ref_cnt{$key}.":".$key."\n";}
0440キュウティイハニ-2009/05/08(金) 18:39:16ID:CAAVVdSZ
>>438
うむ!頑張ってみる!
0441nobodyさん2009/05/08(金) 18:42:59ID:???
簡単に漠然と言っちゃえば % を \ を置き換えたもの
%00 は \0 の NULL 文字となる



だったような気がするんだマイハニー
0442キュウティイハニ-2009/05/08(金) 18:52:02ID:CAAVVdSZ
>>439
検索語が知りたいんです。
0443nobodyさん2009/05/08(金) 18:54:48ID:/tMyodOD
集計したら、あとはそこから検索語を取り出すだけだろ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
もう君Analogでも使ってればいいと思うよ
0444キュウティイハニ-2009/05/08(金) 18:56:58ID:CAAVVdSZ
>>443
バッチで取得したいのですぅ
0445nobodyさん2009/05/08(金) 18:57:50ID:???
馬鹿は死んでも直らないって本当だな
0446nobodyさん2009/05/08(金) 18:59:36ID:???
前にくだすれで大暴れしたりしてた人か
0447キュウティイハニ-2009/05/08(金) 19:01:25ID:CAAVVdSZ
頭を冷やして考えます。
0448nobodyさん2009/05/08(金) 19:34:43ID:???
>>412
まずレスポンスヘッダのチェックからだろ。
0449nobodyさん2009/05/08(金) 19:49:09ID:???
もう相手にしないで

はい次の方どーぞ
0450アルモコニ2009/05/08(金) 19:54:33ID:???
これはどういう意味ですか?


米を煮たいと所存だす。
http://www.google.co.jp/search?hl=ja&q=%E3%83%8B%E3%83%AB%E3%82%B3%E3%83%A1&lr=

ケロロゲ?ムで火をつけリソウシを入れました。
いいぐあいにリソウシは紫の汁を出し、
結局、アルモコニでした。
http://www.google.co.jp/search?hl=ja&q=%E3%82%A2%E3%83%AB%E3%83%A2%E3%82%B3%E3%83%8B&lr=
0451nobodyさん2009/05/08(金) 20:25:18ID:???
数値のソートはsort関数が早いのかな。
試したら圧倒的になったんだけど。
文字列だとGuttman Rosler変換が断トツだった。
0452nobodyさん2009/05/08(金) 21:03:07ID:???
で?
0453nobodyさん2009/05/09(土) 00:02:11ID:???
じ?
0454nobodyさん2009/05/09(土) 01:54:05ID:???
こ?
0455nobodyさん2009/05/09(土) 10:19:40ID:???
 
0456nobodyさん2009/05/09(土) 10:20:01ID:???
にょ!
0457nobodyさん2009/05/10(日) 08:47:53ID:P8pR48B+
i2iアクセス解析のサーチワード一覧のソースが欲しいんです。
0458nobodyさん2009/05/11(月) 20:26:11ID:???
>>457
http://www.google.co.jp/search?q=%CE%B4%CE%B8%CE%BD%CE%B2&lr=
0459nobodyさん2009/05/13(水) 13:11:51ID:oMl7P+AA
すいません。おそらくかなり初心者質問なのですが
xamppの環境で、Shift_JISで書いたコードが、問題なく動作するように
use encoding 'shiftjis', STDOUT => "shiftjis";
を加えたのですが、即座に動かなくなりました。
搭載されているperlはvar5.8.7なので、動かないはずがないのですが・・・
どなたか原因ご存知ありませんでしょうか?
0460nobodyさん2009/05/13(水) 13:24:51ID:???
エラーログぐらい出せクソ野郎
0461nobodyさん2009/05/15(金) 15:32:32ID:???
URLを要素ごとに分解したいのですが、色々調べた結果、自分では以下のような形になりました
一応結果は求めたものなのですが、正解なのかどうかわかりません
普通はこうやるとか、間違ってるからこう直せってのがあったら教えてください

my $url = 'http://www.google.co.jp/';

my($scheme, $userinfo, $host, $port, $path, $query, $anchor) =
$url =~ m/
(https?|shttp):\/\/
(?:((?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)@)?
(\d+\.\d+\.\d+\.\d+|(?:[a-zA-Z0-9][\-a-zA-Z0-9]*[a-zA-Z0-9]\.)*[a-zA-Z0-9]*)
(?::(\d+))?
(?:((?:\/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f])*)*))?
(?:\?((?:[-_.!~*'()a-zA-Z0-9;\/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*))?
(?:\#((?:[-_.!~*'()a-zA-Z0-9;\/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*))?
/ox;
0462nobodyさん2009/05/15(金) 16:04:16ID:???
>>461
つttp://search.cpan.org/~gaas/URI-1.37/
0463nobodyさん2009/05/16(土) 17:28:43ID:C7qkfi2d
use CGI::Lite;
use encoding 'shiftjis', STDOUT => "shiftjis";

print "Content-Type:text/html\n\n";
my $cgi = new CGI::Lite;
my %g = $cgi->parse_form_data('GET');
print $g{'all-text'};

---表示結果---
\x{0093}\x{008c}\x{008b}\x{009e}\x{0093}s\x{008d}]\x{008c}Ë\x{0090}\x{00ec}\x{008b}\x{00e6}
(本当は「東京都江戸川区」とprintされる)
CGI::Liteは最新版。perl5.8.5 unix環境です
0464nobodyさん2009/05/16(土) 18:01:49ID:???
変換元のコードが判別出来てない
0465nobodyさん2009/05/17(日) 15:36:49ID:dGMXPYwm
$BB =~ s/:/&url_encode(:)/g;

url_encodeはサブルーチンで普通に使えています
上記のように$BBに入っている文字列の中の「:」だけを全てエンコードしたいのですが、上記のコードだと「:」が「&url_encode(:)」という文字列に変換されてしまいます
正規表現の中でサブルーチンを呼び出すにはどうすればいいでしょうか?
0466nobodyさん2009/05/17(日) 15:47:36ID:???
e
0467nobodyさん2009/05/18(月) 01:28:52ID:???
1byteで回答
0468nobodyさん2009/05/18(月) 05:31:12ID:???
一体全体、なんでマニュアル調べないんだろうね?
「マニュアルに書いてあることを質問するな」とか云うはるか前の話として、
マニュアルをちょっと調べれば、3秒とか、長くても20秒くらいで
解決することを、わざわざ文章書いてポストするって、
どんだけ時間の無駄づかいなの?
0469nobodyさん2009/05/18(月) 09:09:13ID:???
スレタイをよく見るんだ
0470nobodyさん2009/05/18(月) 09:58:34ID:???
親切な人なら
$BB =~ s/:/&url_encode(':')/ge;
よりも↓の方が負荷がかからない
$BB =~ s/:/%3a/g;
と教えるだろうけどPerl使ってて負荷のこと言うと叩かれそうだから言わない
0471nobodyさん2009/05/18(月) 12:45:23ID:???
use URI::Escape;

my $safe = uri_escape($bb, ":");

これで、おk。
0472nobodyさん2009/05/18(月) 19:48:23ID:???
>>470
質問の本質はそこじゃないしな
0473nobodyさん2009/05/18(月) 20:45:50ID:gm/uB6Cl
>>472
おまえさんには「教えてください」なんて口が裂けても言わないから
ダイジョウブダヨ。
0474nobodyさん2009/05/19(火) 01:35:37ID:???
マニュアル見てもよくわからんってことも少なくないけどな
0475nobodyさん2009/05/19(火) 18:36:32ID:???
構文チェックでokが出てるのに500吐くんですけど、こういった場合ってどういった原因が考えられるんでしょうか?
サーバがUnixなので改行コードはLFにしてあります。アスキーで転送しました。
use strict;が原因かと思ってコメントアウトしたけど500のままなのです。
0476nobodyさん2009/05/19(火) 18:41:42ID:???
>>475
chmod ago+x *.cgi
■ このスレッドは過去ログ倉庫に格納されています