トップページ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/
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
0477nobodyさん2009/05/19(火) 19:34:05ID:???
>>476
おお!動いた!ありがとうございます。
FFFTPの方で700に設定してたのが悪かったのかな・・・。他はこれで動いてるのに。
0478nobodyさん2009/05/19(火) 19:44:30ID:???
>>477
当たっちゃったか

apacheは、apacheユーザとかnobodyユーザとかで動くから、
700じゃ実行権限ないの。この設定はhttpd.confで出来るよ。

他で動いてる理由は、4700か2700になってるとかかもしれないね
もしくはrootユーザに設定されてるか。もしされてるなら危険なので変えよう。
0479nobodyさん2009/05/19(火) 20:22:03ID:???
あとよくあるのが、cgiの場合HTMLを吐かずに終了してる場合
0480nobodyさん2009/05/19(火) 20:32:44ID:???
>>478
自己レス。
ごめん。勘違いに気づいた
4700、2700じゃ実行できるわけないや
0481nobodyさん2009/05/19(火) 20:38:57ID:???
ディレクトリ内のファイルを更新日時でソートして表示するにはどうしますか?
0482nobodyさん2009/05/19(火) 20:40:03ID:???
opendir
stat
map
sort
0483nobodyさん2009/05/19(火) 20:44:51ID:???
mapで何するの?
0484nobodyさん2009/05/19(火) 20:48:58ID:???
qx|ls -tl|
0485nobodyさん2009/05/19(火) 20:50:50ID:???
open IN, "ls -t ./ |";
while(<IN>){
print $_;
}
close IN;

時刻も取りたいなら、-tlにして、\sでsplit
0486nobodyさん2009/05/19(火) 20:51:15ID:???
フォルダ内のファイルを更新日時でソートして表示するにはどうしますか?
0487nobodyさん2009/05/19(火) 21:15:24ID:???
@files = `ls -t`; (新しい順)
@flies = `ls -tr`;(古い順)
0488nobodyさん2009/05/19(火) 21:20:16ID:???
>>486
use strict;
use File::stat;

opendir(DIR, "./") or die;
my @file = readdir(DIR);
closedir(DIR);

my @new = ();
for (@file) {
my $fi = stat($_);
push @new, {name=>$_, mtime=>$fi->mtime};
}
@new = sort { $a->{mtime} <=> $b->{mtime} } @new;

あとは@newが順番は更新日時順でハッシュの配列になってるから。
0489nobodyさん2009/05/19(火) 21:22:11ID:???
.
..

↑これ消さないと
0490nobodyさん2009/05/19(火) 21:26:11ID:???
ほら、初心者の頃って、余計なの入ってると理解が遅れたりするじゃん
まずこれが理解できるようになってから、自分で消してもらうってことで。
0491nobodyさん2009/05/19(火) 21:28:16ID:???
@fileの更新日時ソートを、map、stat、sortで一行で書くにはどうしますか?
0492nobodyさん2009/05/19(火) 21:30:22ID:???
自分でやれw
俺map嫌いなんだよ
0493nobodyさん2009/05/19(火) 21:36:48ID:???
$dir= ".";
opendir(IN, $dir);
@files= map{$_->[0]}sort{$a->[1]<=>$b->[1]}map{[$_,(stat("$dir/$_"))[9]]}grep(-f"$dir/$_", readdir(IN));
closedir(IN);
0494更新日時でソート2009/05/19(火) 21:49:48ID:???
ありがとう。みなさんありがとう。
0495nobodyさん2009/05/19(火) 21:52:56ID:???
まさに黒魔術だよな
0496nobodyさん2009/05/19(火) 23:18:27ID:???
どいつもこいつも古いopen/opendirの書き方しやがって
0497nobodyさん2009/05/19(火) 23:28:19ID:???
openとか、デバッグくらいにしか使わないからなぁ
0498nobodyさん2009/05/20(水) 00:12:40ID:???
新しいのってどんな書き方?
0499nobodyさん2009/05/20(水) 00:15:44ID:???
open IN, ">", $file;
0500nobodyさん2009/05/20(水) 00:21:19ID:???
my @file = glob("./aaa");
とか?
でもこれはopendir+readdirだな

なんかのモジュール使うとかだと、結局はopenのラップだしなぁ

>>496
答えは?
0501nobodyさん2009/05/20(水) 00:31:37ID:???
>>499
入力ファイルが消えてしまったんだが
0502nobodyさん2009/05/20(水) 01:06:52ID:???
openは3引数で書くようになったが
opendirは相変わらず2引数だなぁ
0503nobodyさん2009/05/20(水) 01:15:45ID:???
>>500
ファイルハンドルはグローバルだから使うべからず(STDINとかの例外を除く)
>502の言うように3引数でmyつけて使うべし
0504nobodyさん2009/05/20(水) 01:28:30ID:???
新しい書き方では、出力ファイルのハンドラをINと書く

俺は古いのでいいや、なんか混乱しそうだし
■ このスレッドは過去ログ倉庫に格納されています