Perlコーディング初心者質問スレ Part 59
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/02/16(月) 11:42:29ID:gvPTpodw【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0423nobodyさん
2009/05/08(金) 16:49:19ID:???テストしてみたい
0424キュウティイハニ-
2009/05/08(金) 17:05:05ID:CAAVVdSZ具体的に教えられないんです。
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そこで、切られるみたいです。
でも、ブラウザ(IE8)上では、切れていないんです。
0427キュウティイハニ-
2009/05/08(金) 17:12:10ID:CAAVVdSZ冷たいなぁ。。。
0428キュウティイハニ-
2009/05/08(金) 17:13:41ID:CAAVVdSZ0429nobodyさん
2009/05/08(金) 17:20:09ID:???0430キュウティイハニ-
2009/05/08(金) 17:27:31ID:CAAVVdSZ顕著な検索エンジンを経由してきた検索語と回数をカウントしたいんですが、簡単なんですか?
0432キュウティイハニ-
2009/05/08(金) 17:39:56ID:CAAVVdSZ死ぬほどないんですけど><
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:CAAVVdSZ0437キュウティイハニ-
2009/05/08(金) 18:24:51ID:CAAVVdSZリファラーにq="なんたら"
って書いてある"なんたら"の
"なんたら"と、その回数が知りたいのです
0438nobodyさん
2009/05/08(金) 18:37:21ID:/tMyodOD>>432から"検索語"を抜いた"apache referer 集計 perl"でググっただけで死ぬほど出てくるというのに。
0439nobodyさん
2009/05/08(金) 18:38:33ID:/tMyodODopen 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うむ!頑張ってみる!
0441nobodyさん
2009/05/08(金) 18:42:59ID:???%00 は \0 の NULL 文字となる
だったような気がするんだマイハニー
0442キュウティイハニ-
2009/05/08(金) 18:52:02ID:CAAVVdSZ検索語が知りたいんです。
0443nobodyさん
2009/05/08(金) 18:54:48ID:/tMyodODもう君Analogでも使ってればいいと思うよ
0444キュウティイハニ-
2009/05/08(金) 18:56:58ID:CAAVVdSZバッチで取得したいのですぅ
0445nobodyさん
2009/05/08(金) 18:57:50ID:???0446nobodyさん
2009/05/08(金) 18:59:36ID:???0447キュウティイハニ-
2009/05/08(金) 19:01:25ID:CAAVVdSZ0449nobodyさん
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:???試したら圧倒的になったんだけど。
文字列だと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+0458nobodyさん
2009/05/11(月) 20:26:11ID:???http://www.google.co.jp/search?q=%CE%B4%CE%B8%CE%BD%CE%B2&lr=
0459nobodyさん
2009/05/13(水) 13:11:51ID:oMl7P+AAxamppの環境で、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:???一応結果は求めたものなのですが、正解なのかどうかわかりません
普通はこうやるとか、間違ってるからこう直せってのがあったら教えてください
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;
0463nobodyさん
2009/05/16(土) 17:28:43ID:C7qkfi2duse 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:dGMXPYwmurl_encodeはサブルーチンで普通に使えています
上記のように$BBに入っている文字列の中の「:」だけを全てエンコードしたいのですが、上記のコードだと「:」が「&url_encode(:)」という文字列に変換されてしまいます
正規表現の中でサブルーチンを呼び出すにはどうすればいいでしょうか?
0466nobodyさん
2009/05/17(日) 15:47:36ID:???0467nobodyさん
2009/05/18(月) 01:28:52ID:???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:???my $safe = uri_escape($bb, ":");
これで、おk。
0473nobodyさん
2009/05/18(月) 20:45:50ID:gm/uB6Clおまえさんには「教えてください」なんて口が裂けても言わないから
ダイジョウブダヨ。
0474nobodyさん
2009/05/19(火) 01:35:37ID:???0475nobodyさん
2009/05/19(火) 18:36:32ID:???サーバがUnixなので改行コードはLFにしてあります。アスキーで転送しました。
use strict;が原因かと思ってコメントアウトしたけど500のままなのです。
0477nobodyさん
2009/05/19(火) 19:34:05ID:???おお!動いた!ありがとうございます。
FFFTPの方で700に設定してたのが悪かったのかな・・・。他はこれで動いてるのに。
0478nobodyさん
2009/05/19(火) 19:44:30ID:???当たっちゃったか
apacheは、apacheユーザとかnobodyユーザとかで動くから、
700じゃ実行権限ないの。この設定はhttpd.confで出来るよ。
他で動いてる理由は、4700か2700になってるとかかもしれないね
もしくはrootユーザに設定されてるか。もしされてるなら危険なので変えよう。
0479nobodyさん
2009/05/19(火) 20:22:03ID:???0481nobodyさん
2009/05/19(火) 20:38:57ID:???0482nobodyさん
2009/05/19(火) 20:40:03ID:???stat
map
sort
0483nobodyさん
2009/05/19(火) 20:44:51ID:???0484nobodyさん
2009/05/19(火) 20:48:58ID:???0485nobodyさん
2009/05/19(火) 20:50:50ID:???while(<IN>){
print $_;
}
close IN;
時刻も取りたいなら、-tlにして、\sでsplit
0486nobodyさん
2009/05/19(火) 20:51:15ID:???0487nobodyさん
2009/05/19(火) 21:15:24ID:???@flies = `ls -tr`;(古い順)
0488nobodyさん
2009/05/19(火) 21:20:16ID:???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:???0492nobodyさん
2009/05/19(火) 21:30:22ID:???俺map嫌いなんだよ
0493nobodyさん
2009/05/19(火) 21:36:48ID:???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:???0497nobodyさん
2009/05/19(火) 23:28:19ID:???0498nobodyさん
2009/05/20(水) 00:12:40ID:???0499nobodyさん
2009/05/20(水) 00:15:44ID:???0500nobodyさん
2009/05/20(水) 00:21:19ID:???とか?
でもこれはopendir+readdirだな
なんかのモジュール使うとかだと、結局はopenのラップだしなぁ
>>496
答えは?
0502nobodyさん
2009/05/20(水) 01:06:52ID:???opendirは相変わらず2引数だなぁ
0503nobodyさん
2009/05/20(水) 01:15:45ID:???ファイルハンドルはグローバルだから使うべからず(STDINとかの例外を除く)
>502の言うように3引数でmyつけて使うべし
0504nobodyさん
2009/05/20(水) 01:28:30ID:???俺は古いのでいいや、なんか混乱しそうだし
0505nobodyさん
2009/05/20(水) 01:33:39ID:???入出力に文字コード絡みの指定をしない時は、相変わらず2引数使ってることが多いかな。
けど、使い捨ての短いスクリプト書く時は、文字コード絡みがあっても、ついつい、
open(my $f,"$file_name");
binmode($f,":encoding(cp932)");
とかやっちゃうことも多い。
0506nobodyさん
2009/05/20(水) 01:36:09ID:???逆に不思議だ
0507nobodyさん
2009/05/20(水) 01:39:23ID:???何のことだろって思って調べたんだが、こんな感じであってる?
0508nobodyさん
2009/05/20(水) 01:48:12ID:???0509nobodyさん
2009/05/20(水) 02:03:59ID:???0510nobodyさん
2009/05/20(水) 13:51:48ID:???$hog にblessされたハッシュが入っているのか、テキストが入っているのか、
数値が入っているのかを利用する前に知りたい状況です。
0511510
2009/05/20(水) 13:52:55ID:???○blessされたハッシュのリファレンス
0514nobodyさん
2009/05/20(水) 20:33:00ID:???やりたいことは、"「で始まって」って終わる文字列"を置換したいです。
例えば、"「あ」「い」"を"「★」「★」"に置換したのです。
下記のように記述すると、多分2バイトコードである為、うまくいく場合と行かない場合が
あります。どのように記述すればよいか教えてください。
$data =~ s/「[^「」]*」/「★」/gi;
0515nobodyさん
2009/05/20(水) 20:40:54ID:???0517nobodyさん
2009/05/20(水) 22:23:39ID:???# 例えば入力がCP932(≒Shift JIS)なら……
# foo.pl (UTF-8で保存すること)
use strict;
use warnings;
use utf8;
use Encode;
my $encoding = find_encoding('cp932');
my $data = $encoding->decode(shift);
$data =~ s{
(?<= 「 )
( .+? )
(?= 」 )
}{★}xmsg;
print $encoding->encode($data);
__END__
入力
perl foo.pl 「あ」「い」「ほげほげ」
出力
「★」「★」「★」
まああれだ、正規表現を通さなくても、
入れるときデコード、出すときエンコードの癖を付けような
0518nobodyさん
2009/05/21(木) 01:23:27ID:???{★}xmsg;
を
{'★' x length($1)}xmsge;
にする感じで。
0519nobodyさん
2009/05/21(木) 02:45:24ID:???0521nobodyさん
2009/05/21(木) 15:48:56ID:???>>517氏の言うように、入出力時に変換するのが基本だから、
どこから読み込んで、どこに出力して、入力、出力、スクリプトそれぞれの
文字コードの情報があると、回答も得られやすいと思う。
古いPerlの場合、CPANからモジュールを突っ込んで使うか、
自分でガリガリ正規表現を書くことになる。
質問に条件をつければ、答えてくれる奇特な人がいるかもしれない。
全て文字コードCP932(日本語Windows環境)と仮定して、
ファイルから読んで、標準出力に出力する場合。
use encoding qw(cp932);
use open qw(:encoding(cp932) :std);
open(my $fh, "foo.txt") or die $!;
my $data = join('', readline($fh));
close($fh);
$data =~ s/「(?:[^」]+)」/「★」/g;
print $data;
0522514
2009/05/21(木) 16:41:46ID:???文字コードはShift_JISです。
具体的に説明します。
以下のコードを実行すると
2番目の「」の部分が置換されないのです。
プログラムを始めたばかりの未熟ですみません。
$data = "あ「い」う「ニ世、三世」え";
$data =~ s/「(?:[^」]+)」/「★」/g;
print $data;
exit(0);
0523nobodyさん
2009/05/21(木) 16:42:15ID:???■ このスレッドは過去ログ倉庫に格納されています