トップページ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/
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と書く

俺は古いのでいいや、なんか混乱しそうだし
0505nobodyさん2009/05/20(水) 01:33:39ID:???
自分もファイルハンドルにmy 付けて$変数にするのはもうクセになってるけど、
入出力に文字コード絡みの指定をしない時は、相変わらず2引数使ってることが多いかな。

けど、使い捨ての短いスクリプト書く時は、文字コード絡みがあっても、ついつい、
open(my $f,"$file_name");
binmode($f,":encoding(cp932)");
とかやっちゃうことも多い。
0506nobodyさん2009/05/20(水) 01:36:09ID:???
ファイルハンドラとかopendirのハンドラとか、なんで変数じゃなくていいんだろうな
逆に不思議だ
0507nobodyさん2009/05/20(水) 01:39:23ID:???
open my $fh, '+<', 'path' or die $!;

何のことだろって思って調べたんだが、こんな感じであってる?
0508nobodyさん2009/05/20(水) 01:48:12ID:???
そんな感じであってる
0509nobodyさん2009/05/20(水) 02:03:59ID:???
どうせなら die "$file:$!";
0510nobodyさん2009/05/20(水) 13:51:48ID:???
$hog に何が入っているか利用する前に調べる関数とかあるのでしょうか?
$hog にblessされたハッシュが入っているのか、テキストが入っているのか、
数値が入っているのかを利用する前に知りたい状況です。
05115102009/05/20(水) 13:52:55ID:???
×blessされたハッシュ
○blessされたハッシュのリファレンス
0512nobodyさん2009/05/20(水) 13:57:10ID:???
>>510
ref
05135102009/05/20(水) 14:21:19ID:???
>>512
ありがとうございます。
これでいけそうです。
0514nobodyさん2009/05/20(水) 20:33:00ID:???
正規表現を教えてください。
やりたいことは、"「で始まって」って終わる文字列"を置換したいです。
例えば、"「あ」「い」"を"「★」「★」"に置換したのです。
下記のように記述すると、多分2バイトコードである為、うまくいく場合と行かない場合が
あります。どのように記述すればよいか教えてください。

$data =~ s/「[^「」]*」/「★」/gi;
0515nobodyさん2009/05/20(水) 20:40:54ID:???
s/「(?:あ|い)」/「★」/g
0516nobodyさん2009/05/20(水) 20:55:54ID:???
>>515
ダメ
0517nobodyさん2009/05/20(水) 22:23:39ID:???
>>514
# 例えば入力が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:???
(´-`).。oO(.xlsの変換なんだろうなぁ。。。)
0520nobodyさん2009/05/21(木) 10:31:35ID:???
>>517
「原理原則」や「机上の空論」を正論と思って賞賛してよいのは中学二年生まで
0521nobodyさん2009/05/21(木) 15:48:56ID:???
>>514の質問は不明な点が多すぎ。
>>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;
05225142009/05/21(木) 16:41:46ID:???
説明足らずですみません。
文字コードはShift_JISです。
具体的に説明します。
以下のコードを実行すると
2番目の「」の部分が置換されないのです。
プログラムを始めたばかりの未熟ですみません。


$data = "あ「い」う「ニ世、三世」え";
$data =~ s/「(?:[^」]+)」/「★」/g;
print $data;

exit(0);
0523nobodyさん2009/05/21(木) 16:42:15ID:???
ワラタ
0524nobodyさん2009/05/21(木) 19:18:34ID:???
$data = "あ「い」う「ニ世、三世」え";
$data =~ s/「.+?」/「★」/g;
print $data;

v(★0★)v
0525nobodyさん2009/05/21(木) 21:18:35ID:???
なぜ(?:を知ってて+?を知らぬ
0526nobodyさん2009/05/21(木) 21:47:57ID:???
それは>>521を丸コピペしただけだからだと思うよぉ
*?と+?は今後よく使うはずだから覚えておこう
0527nobodyさん2009/05/21(木) 22:17:03ID:???
あんな便利というか必須な機能が、perl4には無いんだよな
0528nobodyさん2009/05/21(木) 22:37:14ID:???
ちなみにperlの正規表現についてはここを見ておくと吉
ttp://www.kt.rim.or.jp/~kbk/regex/regex.html#PERL
0529nobodyさん2009/05/21(木) 22:58:52ID:???
perl4は忘れなさい
0530nobodyさん2009/05/22(金) 12:59:45ID:???
>>522
use strict;
use warnings;
use encoding qw(cp932);
use open qw(:encoding(cp932) :std);

my $data = "あ「い」う「ニ世、三世」え";
$data =~ s/「.+?」/「★」/g;
print $data;

exit;

[^x]+より.+?の方が速いは、衝撃的。
05315142009/05/22(金) 13:01:09ID:???
>>524-528

ありがとうございます。
しかし、.+?とは、どういう意味なのかしらん?
0532nobodyさん2009/05/22(金) 13:20:16ID:???
「1文字以上」 の 「何らかの文字」 の 「最短マッチ」 

左から
+ . ?
0533nobodyさん2009/05/22(金) 15:52:26ID:???
えっ
0534nobodyさん2009/05/22(金) 16:25:07ID:???
>>528で確認すると

> +? +と同様ですが、マッチングがものぐさ(non-greedy)に行われる点が異なります。

とあるが、ものぐさと言われてもわけが分からんだろうな。
greedyが「貪欲な」という意味になるので、non-greedyなら「慎ましく」あたりが該当するのではないか。

だが、慎ましくと言われてもなお意味不明なことだろう。
しかし同時に、分からない者は置いてけぼりで構わないという高潔さも感じたことだろう。
正規表現を覗くものは、正規表現からも覗かれているのだ。
0535nobodyさん2009/05/22(金) 19:12:35ID:???
なんか見つかったらそれで終わり、というあたりがものぐさなんだろうけど

何故原文も翻訳もそんなあいまいな表現をしたがるんだ
■ このスレッドは過去ログ倉庫に格納されています