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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

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

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

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

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

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0054nobodyさん2006/11/28(火) 00:47:22ID:???
どうしてもTRUE|FALSEでほしいなら自前の関数でラッピングしてください
0055nobodyさん2006/11/28(火) 00:48:20ID:???
return undef;の話はPerlベストプラクティスに載ってるね。
0056nobodyさん2006/11/28(火) 02:23:57ID:???
<FORM action="a.cgi" method="POST">
#いろいろな項目入力
<INPUT type="submit" value="実行a">
</FORM>

実行aボタンを押すと、a.cgiが実行されますが、
実行aボタンを押して同時に下のb.cgiを実行する
方法ありますでしょうか。

<FORM action="b.cgi" method="POST">
#いろいろな項目入力
<INPUT type="submit" value="実行b">
</FORM>

a.cgiの処理コードの中に、b.cgiの処理コードを
書くぐらいしか思いつきません。

よろしくお願いします。
0057nobodyさん2006/11/28(火) 05:30:21ID:PG2nYwJ4
こんな時間にすいません。誰かいたら教えて下さい
phpで例えば<?php include("○○.php"); ?>というのがあります。
これは○○.phpを上の記述を書いたphpに表示させることができます。

perl(cgi)も同様なことできますでしょうか?
index.cgiにabc.cgiを表示させたいんですけど。
やり方ありましたら教えて下さい m(_ _"m)ペコリ
0058nobodyさん2006/11/28(火) 09:44:54ID:???
>>56
一つの体で、別々の場所に行く電車に乗れますか?
自分で思いついた方法で大丈夫です。

>>57
つ require、or module
0059nobodyさん2006/11/28(火) 10:10:33ID:???
>>58
レスありがとうございます
軽くしらべてみたんですが難しいですね
それでできればいいんですが・・・
がんばってみます
0060nobodyさん2006/11/28(火) 10:44:39ID:???
>>58
多重影分身すればいいのか
0061nobodyさん2006/11/28(火) 10:54:01ID:???
チャクラが人並以上に必要だってばよ
0062nobodyさん2006/11/28(火) 14:47:00ID:???
@grepedarray = grep(/^[A-Z]/,@array);
こういう文に置換 - s/ / / -を組み合わせたいのですが出力が上手く表示できません
どうしたらよいでしょうか?
0063nobodyさん2006/11/28(火) 15:01:43ID:???
ようわからんが map も使えば?
0064nobodyさん2006/11/28(火) 15:08:26ID:???
@grepedarray = map { /^o^\ } grep(/^[A-Z]/,@array);
0065nobodyさん2006/11/28(火) 15:13:05ID:???
ちょw 誰が フッジサーン 使えと言ったwwwww
0066nobodyさん2006/11/28(火) 15:16:09ID:???
map {push(@grepedarray) if(s///);} @array;
これでもおk?
0067662006/11/28(火) 15:21:19ID:???
連投すまん
push(@grepedarray)
じゃなくて
push(@grepedarray, $_)
じゃないとだめかも
0068nobodyさん2006/11/28(火) 15:55:32ID:???
それならforeach使えばいいのに。
0069nobodyさん2006/11/28(火) 19:55:31ID:???
>>66-67
それはダメ。mapを使うなら、返り値を利用するべき。
0070nobodyさん2006/11/28(火) 19:56:25ID:???
ごめん、「ダメ」はいいすぎた。あくまで「おすすめできない」って事でひとつ・・・
0071nobodyさん2006/11/28(火) 20:59:18ID:???
素直に block で
@grepedarray = grep { s/ / / ; /^[A-Z]/ } @array ;
@grepedarray = grep { $flag ++ if /^[A-Z]/ ; s/ / / ; $flag } @array ;
じゃ駄目なのか?(適当に書いたが)
0072nobodyさん2006/11/28(火) 21:04:48ID:???
取得しない値まで置換とかする必要ないだろ・・・常識的に考えて・・・
0073712006/11/28(火) 21:17:03ID:???
>>72
そうだ罠。(実際書く時には当然もっと丁寧に if 文書くけどさw)

ただ @array に grep でアクセスした後、map or foreach で
アクセスするなら実質 2 回のループなわけで…。
そっちも十分に無駄っぽいよね。
0074nobodyさん2006/11/28(火) 21:34:23ID:???
そんな事言ってたらPerlでプログラミングできませんよ(´・ω・)
もっと富豪的に
0075nobodyさん2006/11/28(火) 21:43:35ID:???
grep 使ってる時点で十分富豪w
0076 ◆TWARamEjuA 2006/11/28(火) 22:00:53ID:????BRZ(6677)
@grepedarray = grep {
 /^[A-Z]/
  ? s/ / /
   ? 1
   : 1
  : undef
 } @array;
0077nobodyさん2006/11/28(火) 22:05:24ID:???
ここらへんで誰かが Bench ってくるとエスパー
0078nobodyさん2006/11/28(火) 22:10:11ID:???
ふと思ったんだが、処理速度のbenchならBenchmark.pmだけど
メモリのbenchってどうやんだ?やる方法ある?
0079nobodyさん2006/11/28(火) 22:24:28ID:???
>>76
そう来るならこっちの方がもっとスマート
grep { /^[A-Z]/ ? s/ / / || 1 : undef } @array;
0080nobodyさん2006/11/28(火) 22:39:36ID:???
だったら grep { /^[A-Z]/ and s/ / / || 1 } @array; でもいくね?
0081nobodyさん2006/11/28(火) 22:43:03ID:???
そうデスorz...
0082nobodyさん2006/11/28(火) 22:48:03ID:???
>>78
Windowsじゃ動かんし使ったことも無いのだけれど、
forkしてから走らせて使用メモリサイズを調べるmemchならあるね…
ttp://search.cpan.org/~salva/Memchmark-0.01/lib/Memchmark.pm
freeで確保した領域をOSに返しちゃうタイプのライブラリだとそもそも成立しない方法っぽい

それから、Perlをデバッグオプションつきでコンパイルしておけば、
色々メモリ関連情報が調べられるんだったと記憶しているけれど、
どの程度できるのかよく知らんです。
0083nobodyさん2006/11/28(火) 22:54:46ID:???
>>82
> Memchmark.pm
ああ!それがあったか。試してみよ。THX!
0084nobodyさん2006/11/29(水) 00:11:52ID:YenD9j36
25桁*1000万件の重複しない数値データをcsvファイルに格納させるため、
以下のようなプログラムを書きました。


my %no;

for (my $cnt = 1; $cnt <= 10000000; $cnt++) {
my $s_no = main::create_no();

$no{$s_no} = 1;


if(!open(FH, ">>./no.csv")){
print "Error " . __LINE__ . "\n";
exit;
}
flock(FH, 2);
print FH $s_no . "\r\n";
flock(FH, 8);
close(FH);
}


create_no内では
if(not exists $no{$c_no}){ return $c_no; }
このようにハッシュのexsistsを使用して重複チェックをかけているのですが、
やはりメモリを大量に消費してしまうため、900万あたりからものすごい時間が
かかってしまいます。

効率的な方法があればどうかご教示ください。
恐れ入りますが宜しくお願いいたします。
0085nobodyさん2006/11/29(水) 00:19:15ID:???
25桁で連番で1000万件書き出す
桁数が決まってるのでバイナリアクセスで

filepos1 = rnd * 総レコード数
filepos2 = rnd * 総レコード数

この pos1 と pos2 を入れ替え
あとは好きな回数だけswapすればいいかと思います

すべての件をメモリに保持しないので仕様メモリは極小で済みますが、
ディスクI/O がかなり発生します。
0086nobodyさん2006/11/29(水) 00:59:08ID:???
>>85
ご教示有難うございます。

この方法ですと、1000万回ファイルを読み込む、という
解釈で宜しいでしょうか。
0087nobodyさん2006/11/29(水) 01:15:11ID:???
50万回シャッフルする場合は

1000万回ライト
50万回シーク
50万回リード
50万回シーク
50万回ライト

って感じです
0088nobodyさん2006/11/29(水) 01:15:58ID:???
Perl5.8以降なら、こんな事もできます。
http://blog.livedoor.jp/dankogai/archives/50681645.html
0089nobodyさん2006/11/29(水) 22:03:44ID:???
>>58
お礼すごい遅れました。
ありがとうございました。
0090nobodyさん2006/11/29(水) 23:37:00ID:???
>>62です。
みなさん色々ありがとうございました。
0091nobodyさん2006/11/29(水) 23:58:32ID:???
@grepedarray = grep { /win/ and s/win/BIG/ } @array;

$cnt = grep(/win/,@array);

print "大文字\n@grepedarray\n計$cnt個\n";

この文で$cntの部分が 計0個とでてしまんですが何が問題なんでしょう?
0092nobodyさん2006/11/30(木) 00:14:17ID:???
>>91
grep{} 内の $_ は元 array の要素のエイリアスだから、
一行目にて $_ を直接変更してしまっている。それがやなら
@grepedarray = map { $foo = $_ ; $foo =〜 s/win/BIG/ ; $foo } grep { /win/ } @array ;
てなかんじで map 中で $foo にいったん代入してから変更する事
ちなみに上の map 中の $_ も @array の要素のエイリアス( s/// したら変更されちまう)
0093nobodyさん2006/11/30(木) 00:17:52ID:???
map っていまいちつかいどころ分からない
ブロックで囲っちゃえばいいじゃんとか思うのだが
0094nobodyさん2006/11/30(木) 00:18:50ID:???
×一行目にて $_ を直接変更してしまっている。それがやなら
○一行目にて元要素を直接変更してしまっている。それがやなら
0095nobodyさん2006/11/30(木) 00:30:46ID:???
>>92さん
ありがとうございます。理解できました。^^
0096nobodyさん2006/11/30(木) 00:32:28ID:???
>>93
例を挙げるとシュワルツ変換には必須。
my @array = ( '1,2', '2,1' ) ;
my @sorted = map { $_->[0] }
        sort { $a->[1]<=>$b->[1] }
        map { [ $_, (split /,/, $_ )[1]] } @array ;
上を普通の for 文で書くと捨て array を数個書くはめになり、7 行以上になることは確定。
とは言いながらも使うかどうかは完全に趣味の問題
0097nobodyさん2006/11/30(木) 01:25:15ID:???
>>93
何を抜かしてるのかと思ったら、ここ WebProg 板なのね…。
0098nobodyさん2006/11/30(木) 02:58:21ID:???
>>93
たとえばだけど、ハッシュを引数に取るサブルーチンに
foo( map { $_ => $hash{$_} =~ /^\d+$/ ? $hash{$_} * 2 : "str".$hash{$_} } keys %hash);
などと使えて便利。
0099 ◆TWARamEjuA 2006/11/30(木) 07:00:27ID:????BRZ(6677)
my $Now_date = sprintf qq|%04d/%02d/%02d|, # 日付を生成
map {
$_->[0] += 1900;
$_->[1]++;
@$_
} [(localtime)[5,4,3]];
0100nobodyさん2006/11/30(木) 08:57:31ID:???
>>99
…さすがにそれは普通に sub に渡すだろ
my $Now_date = sprintf qq|%04d/%02d/%02d|,
sub { $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
もしくは
my $Now_date
  = sub{ sprintf qq|%04d/%02d/%02d|, $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
0101nobodyさん2006/11/30(木) 10:53:04ID:???
>>9
Jcode.pm は知らんけど、Encode.pm は重い。
一般的な掲示板CGIで use Encode; しただけで、2〜3割CPU負荷が高くなった。

0102nobodyさん2006/11/30(木) 10:55:09ID:???
ファイルを開く時に、

open(FILEHANDLE, ">> filename") ;

という書き方をしますよね。

この書き方はファイル名がダブルクォーテーションで囲われないのでいまいち好きになれません。

例えば、ファイル名が " test.txt" (半角スペースが左にある) だった場合にはどうすればいいんでしょうか?
0103nobodyさん2006/11/30(木) 11:08:52ID:???
>>102
open(FILEHANDLE, ">>", " test.txt");
0104nobodyさん2006/11/30(木) 11:10:16ID:???
殆どの解説サイトでは、フォームの要素を取り出す場合などに、

use CGI;
$q = new CGI;
print $q->param('name');

と解説していますが、

use CGI":all"
print param("name")

というコードを見つけました。(両方ともXSS脆弱性がありますがこれはサンプルです。)

後者だと関数名の重複が起こる可能性が高くなるかと思いますが、
速度低下などのデメリットはないでしょうか?
01051022006/11/30(木) 11:11:04ID:???
>>103
カンマで区切って3つめのパラメーラーにすることも可能でしたか
そっちの方が美しいので全部をそっちに統一しようかとおもいます
ありがとです
0106nobodyさん2006/11/30(木) 11:23:07ID:???
>>104
速度はどうせ全体からすれば誤差ぐらいしか違わない。
むしろ関数名重複の方の問題でいまどきは普通使わない
書き方だから、既にそういう風に書かれているプログラムを
読まなきゃいけないならしょうがないが、これから書くのなら
前者の書き方にしとけ。
01071042006/11/30(木) 11:27:47ID:???
>>106
なるほど。
見た目は美しくなくなりますが、パッケージ同士で同じ関数名が使われていたら困るのでそうしてみます。
ありがとうございました。
0108nobodyさん2006/11/30(木) 18:04:24ID:???
Perlスクリプトの処理時間を計測したいのですが、
(times)[0]を使うやり方で出てくる数値が、実時間と違うような気がします。
これで求められる時間の単位は何なんでしょうか?
0109nobodyさん2006/11/30(木) 18:33:33ID:???
CPU秒
0110nobodyさん2006/11/30(木) 19:51:57ID:???
Benchmark 使えばいいじゃん
0111JAPU ◆lVJAPUTeX. 2006/11/30(木) 20:29:39ID:???
>>93

map はあるリストを元にして別のリストを作るために使います。
もちろん、map を利用しなくてもプログラムは書けますが、map を利用したほうがすっきりと書けることが多いのです。

@odds = (20, 16, 4, 8, 12);
print_odds(map { $_*2 } @odds);

@ids = qw[mami pelsia emi yumi];
@names = map { $userinfo{$_}{name} } @ids;

>>100

むしろ、strftime

>>101

多く起動される環境であれば、mod_perl, SpeedyCGI, FastCGI を検討するべきかと。

たしかに Encode は重いけど…
% /usr/bin/time perl -e ''
0.00 real 0.00 user 0.00 sys
% /usr/bin/time perl -MEncode -e ''
0.07 real 0.01 user 0.01 sys
Perl v5.8.1以降であれば、JcodeはEncodeのwrapperとして動作するので、Encode単体より重くなります。

>>102

open FH, "> ./ filename"; としても良いです。
0112nobodyさん2006/11/30(木) 21:31:15ID:???
COOKIEについて質問です。

今まで、COOKIEが有効かどうかって、
x.cgiでCOOKIEセット、y.cgiに飛ばす
y.cgiでCOOKIE読んで、書き込みできたかチェック
こんなことしてました。

COOKIEが有効か調べる関数ってありますでしょうか。
よろしくお願いします。
0113nobodyさん2006/11/30(木) 21:42:53ID:???
>>107
個人的な嗜好の問題だけど俺は前者の方が美しいと思う
0114nobodyさん2006/11/30(木) 22:28:40ID:???
ちょいと質問させてください。

my %func = (
'1'=>'\&hoge',
);

sub hoge
{
処理
}

$func{'1'}->();

ぐぐってみたらこれでhogeが実行できる
みたいなことが書いてあったんですが
ダメみたいなんすよ。
なぜかわかりませんかねぇ?
0115nobodyさん2006/11/30(木) 22:46:53ID:???
>>114
'1'=>\&hoge

の間違いでしょう? クォートしちゃダメ。
0116nobodyさん2006/11/30(木) 23:24:54ID:???
ありがとうございやす!動きました。
ぐぐって見つけたページもクォートなしでした。
いやはやお恥ずかしい。
0117nobodyさん2006/12/01(金) 01:14:03ID:???
明らかに文字列を受け取って文字列を返す関数にundef渡したとき、
戻り値はundefと0文字列のどっちが安全で親切なんだろうか。
ケース倍ケースかな。

0118nobodyさん2006/12/01(金) 02:08:36ID:???
お願いします。

sub aaa{
 my $select;
 foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){
  $select .= qq|<option value="$count">$l</option>\n|;
 }
 return $select;
}
上記をCGIで動かすと
「Can't use "my $a" in sort comparison at ...」
というエラーがでます。どう改善したらよいのでしょうか...
環境は
windowsXPsp2
ActivPerl 5.8.7
です。
0119nobodyさん2006/12/01(金) 02:22:30ID:???
use strict;

my %ir = (
'kaede' => '大瀬 楓',
'mikitty' => '藤本 美貴',
'maasa' => '須藤 茉麻'
);

foreach my $l (sort { $a cmp $b } keys %ir){
  print "<option value=\"$l\">$ir{$l}</option>\n";
}

うちではエラー出ず。

で、ちょっと突っ込みを

key で sort 掛けようとしてるんですよね?
なのにデータで sort 書けちゃってますよ?
0120nobodyさん2006/12/01(金) 02:38:41ID:???
>>119
はい。
以下のようなハッシュを値でソートしたいと思いまして・・・。

%ir = (
"あああ" => 1,
"いいい" => 2,
"ううう" => 3,
"えええ" => 4,
"おおお" => 5,
"かかか" => 6,
"ききき" => 7
}

.pl単体では上手くテストで動いたんですけど、いざCGI用に
コピーするとエラーがでます(T_T)
0121nobodyさん2006/12/01(金) 03:20:08ID:???
>>118
$count はどっからでてきたの? パッケージ変数? $ir{$l} の間違いじゃない?
それに、『sort に渡してる関数の中で「my $a」とは書けません』ってエラーなんだから
実際の CGI ファイルのコードは違うんじゃないの? ちゃんと確認した?
0122nobodyさん2006/12/01(金) 08:18:39ID:???
>>111
> むしろ、strftime
POSIX::strftime か。しらなんだ、とんくす。
0123nobodyさん2006/12/01(金) 10:57:45ID:???
Shift_JIS 環境です。

CGI.pm の escapeHTML 関数を使うと、「規制」 が 「&#8249;K制」 (実際には、&と#は半角) になっちゃうんですが、
どうにかならないものでしょうか…。

これじゃあ、日本語を処理する上で実用性が無いので困っています。
01241232006/12/01(金) 11:01:25ID:???
というより、何故こんな風になるのかが知りたいです。

HTMLの特殊文字は↓ですよね。
< = 0x3C
> = 0x3E
& = 0x26
" = 0x22
' = 0x27

そして、問題となる "規" は、0x8B4B です。

特殊文字にあたるコード(16進レベル)が含まれていないので、
おかしくなる理由がないと思うのですが…。
0125nobodyさん2006/12/01(金) 11:10:09ID:???
>>123
CGI.pmを読めばわかるが、charsetがISO-8859-1かWINDOWS-1252のときに
その変換が行われるようになっていて、charsetは特に指定がなければISO-8859-1
だからほっとくとそうなる。CGI.pmのescapeHTML使うんならcharset設定すればよい
と思われる。あるいは別のを自分で書くなりどっかから探してくるなりして使うかだな。
0126nobodyさん2006/12/01(金) 11:16:18ID:???
データベース検索のCGIを作っているのですがサーバ負荷(CPU)が高くて困っています。
ファイル数は200個、容量は全部で40MB程のテキストファイルで、ファイル数と容量はだんだん増えていきそうです。
数回実行しただけで Load Average が 1.00 を超えるような状況で、このままじゃサイト閲覧者向けに公開できそうにないです。

データベースの構造はこんなこんな感じです。
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)
要素1<>要素2<>要素3<>要素4<>要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文要素5は長文(400バイトぐらい)

ちなみに、検索処理には index 関数を使っています。
ファイル内容は一回変数にいれるといったことはせずに、openでよみとって 1行ずつ検索して、おわったら閉じる。openでファイル開いて・・・ の繰り返しです。
負荷の原因と考えられるのはどこらへんでしょうか?

(1) 200個 のファイルを open 関数で開く処理。
(2) index関数での検索

ちなみに、必要なのは要素1と要素2だけ、しかも、完全一致でいいので、
split関数で要素毎に分割して == を使って等しければー、にしたほうが負荷は少なくなるもんなんでしょうか?

ある程度絞り込めれば実験でもいいんですが、
負荷関係に詳しい方がいたらお願いします。
01271232006/12/01(金) 11:21:25ID:???
>>125
回答ありがとうございます。

charset指定というのはどんな感じにやるもんなんでしょうか?

use Encode 風に指定して、

use CGI 'sjis';
use CGI 'shift_jis';

とかやってみましたが、駄目だったようですorz
0128nobodyさん2006/12/01(金) 11:31:17ID:???
>>121
sub aaa{
my $count = 1;
my $irselect;
foreach my $l(sort { $ir{$a} <=> $ir{$b} } keys %ir){
next if ($l == 99);#("99"=>"99")というデータを省く
$irselect .= qq|<option value="$count">$l</option>\n|;
 $count++;
}
print<<"_EOT";
.
.
<select>
$irselect
</select>
.
.
_EOT
}
こんな感じです。
一応並び順を考えない仕方で解決しました。
もう少し自分で調べてみます。ありがとうございました。
0129nobodyさん2006/12/01(金) 11:32:40ID:???
>>127
キーワード教えてもらったんだからマニュアルぐらい読めよ...

Provided that you have specified a character set of ISO-8859-1 (the
default), the standard HTML escaping rules will be used. The "<" char-
acter becomes "<", ">" becomes ">", "&" becomes "&", and the
quote character becomes """. In addition, the hexadecimal 0x8b
and 0x9b characters, which some browsers incorrectly interpret as the
left and right angle-bracket characters, are replaced by their numeric
character entities ("?" and "?"). If you manually change
the charset, either by calling the charset() method explicitly or by
passing a -charset argument to header(), then all characters will be
replaced by their numeric entities, since CGI.pm has no lookup table
for all the possible encodings.

charset()メソッドを使うか、header()に-charset引数を渡せばいいらしい。
01301232006/12/01(金) 11:35:16ID:???
>>129
ご親切にありがとうございます。
次からなるべくマニュアル読むようにします。

01311232006/12/01(金) 11:39:27ID:???
実際に使ってみたら解決しました。

$CGI->charset('Shift_JIS');

ありがとうございました。
01321262006/12/01(金) 11:43:37ID:???
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2306988 を参考に時間の計測をしてみたら、

全体で 1秒ちょっとだったのが、index関数の部分をコメントアウトしたら、
0.01秒ぐらいに…。

ここまで極端に分かるとはおもいませんでした
01331262006/12/01(金) 11:47:52ID:???
勘違いでしたorz
while (my $line = <IN>)
の部分もコメントアウトしてました。
これを外したら、0.6秒ぐらいに…。

膨大なデータを1行ずつ読み込む、ここが負荷のメインだったようです。

こうなると、namazuとか他の言語を使うぐらいしか負荷削減の方法はないですね。
0134nobodyさん2006/12/01(金) 11:49:40ID:???
>>126
毎回40MBあってこれからもどんどん増える予定のファイルを全部なめるのがそもそもだめ。
もう少しデータの持ち方を工夫した方がいいよ。バークレーDBぐらいはせめて使え。あるいは
インスコ面倒でなければまともなDB(mysqlとかpostgresとか)つかっちゃったほうが楽な気も
する。
01351262006/12/01(金) 11:54:15ID:???
>>134
なるほど
DB使ったほうがいいわけですか…
それは思いつきませんでした

実はこれフリーで配布されているCGIスクリプトのログファイルでして
過去ログも含めた検索をやりたいのでその検索スクリプトを自作していたとこなんです

ログファイルをHTML化して namazu かなんかで検索させるのとDB化、両方を検討してみます。
0136nobodyさん2006/12/01(金) 12:07:44ID:???
read(FH, $buff, (-s FH));

でログを読んだときは負荷減りませんか?
0137nobodyさん2006/12/01(金) 12:40:28ID:???
ファイルを全部読む時点で負けだろ
01381262006/12/01(金) 12:42:32ID:???
>>136
サンクスです。
読み込んだ時点の負荷は 1/3 〜 1/2 程度になりました。(でも1行ずつの処理を加えると同じかそれ以上になるかも…)

ただ、変数 $buff には全データが入っていることになるので、これを1行ずつ処理するときにどうすべきかが悩みます。
split 関数 で改行コードでの分割をして、配列にいれてから、while 関数で1行毎に処理したくなりますが、
これだとメモリ山ほど食いそうですし…。
0139nobodyさん2006/12/01(金) 13:28:54ID:???
>>126
>>134に禿同です。
検索対象が決まっているのなら、その元のデータから検索用のデータ(インデックス)を作るプログラムを作り、
定期的に保守をするのが楽です。この処理自体が多少重くても、バックグラウンドで1日数回で済むのなら
いいのではないかと。
インデックスデータは、DBMに持たせる(検索対象文字列をキーにする)のが一番効率がいいと思います。
プレーンテキストでも、元のデータを丸々スキャンするよりはるかにましです。
01401262006/12/01(金) 13:43:25ID:???
>>139
やはりその方法がベストですよね。
データベースの勉強をしてやってみようかと思います。
ありがとうございました。
0141nobodyさん2006/12/01(金) 14:04:00ID:???
正規表現で、エスケープをつけて表す文字は
+ * ? . ( ) [ ] { } | \
らしいのですが、/もですよね?
if($aaa =~ /\//)
とすれば望みどおりの動作をするのでこう思うのですが、間違ってますか?
0142nobodyさん2006/12/01(金) 14:26:10ID:???
/そのものじゃなくて区切り文字
当然要エスケープ
0143nobodyさん2006/12/01(金) 18:30:05ID:???
でも区切り文字変えたほうが読みやすいと思う
$hoge =~ m{/}
0144nobodyさん2006/12/01(金) 18:55:31ID:???
ttp://www.sk.aitai.ne.jp/~shim/Workshop/html/wlist.htm

ここの真ん中付近にあるリスト作成を使ってファイルを出力しようとしてるんですが、
出力ファイル先のカタカナのサ行などが文字化けしてしまいます。
jcode.pl を使えば直るんじゃないかと思っているのですが、どこに何を書き足せばいいのでしょうか?
0145nobodyさん2006/12/01(金) 18:58:33ID:???
スクリプト改造依頼スレへどうぞ
http://pc8.2ch.net/test/read.cgi/php/1157787046/
0146nobodyさん2006/12/01(金) 19:39:42ID:???
>>145
そんなに大変な事だったんですか。
どこかを書き足すだけで解決できると思ってたのですが、大変そうなので諦めます・・・。
申し訳ありませんでした。
0147nobodyさん2006/12/02(土) 00:17:21ID:???
<FORM action="xxx.cgi" method="POST">
<INPUT type="submit" value="送信">
</FORM>
これを送信ボタン押すとPOST形式で送信されると思いますが、
プログラムが自動でPOST送信する方法ありますでしょうか。

GET形式の場合は、"http://xxx/xxx.cgi?xxx=xxx";
wget すればよいでしょうか。

よろしくお願いします。
0148nobodyさん2006/12/02(土) 02:43:19ID:???
>>147
GETの場合そのとおり。「送信」はURL encodeしる。curl なら
curl -d xx=送信(URL ncodeしる) "http://xxx/xxx.cgi";
でPOSTできる。ってかここperlスレなんだが。
LWPでもできるよ。
0149nobodyさん2006/12/02(土) 08:58:16ID:???
>>147
LWPっていうモジュールがあったんですね。
こういうのが知りたかったんです。
ありがとうございました。
0150nobodyさん2006/12/02(土) 11:24:22ID:???
WindowsでCGIを作っています。
GDで日本語文字列を出力したいのですがうまくいきません。
現状、stringTTFメソッドでTrueTypeフォントのパスを指定してるのですが(WindowsのFontsフォルダ内)
エラーは出ないものの「・・・」といった出力にしかなりません。英数字でも同様です。
Winで画像出力の際にbinmodeを指定するような感じで
何かあるのかも、と思って調べてるのですが・・・
ちょっと漠然としていますが、チェックポイントなど気がついた方いましたら
おしえてください。よろしくおねがいします。
0151nobodyさん2006/12/02(土) 12:46:30ID:???
自作の関数で、エラーのときにエラーメッセージを返したいときに、
$@とか勝手に上書きしたらまずいですか?
#やってみたらできましたが・・
何か専用の特殊変数ってありますか?
0152nobodyさん2006/12/02(土) 13:03:38ID:???
$gErrStr のようなエラー用のグローバル変数を用意するか、

my $err = &testfunc(\$ret, \$val1, \$val2);

のように渡して、戻り値は \$ret へ入れて、エラーコードとこエラー文字列は $err に返す
といったことも出来る

エラー無しの場合は $err は undef であるか "" または 0 です。
0153nobodyさん2006/12/02(土) 13:23:08ID:???
どうもです。
関数はモジュール化したいので、自前のグローバル変数は使いたくないんですよねえ。
しかもオブジェクト指向にしたいんですが、returnでエラー返す以外に
定番の方法ってないですか?
0154nobodyさん2006/12/02(土) 13:29:26ID:???
エラーメッセージを取得するメソッドを定義するとか、Error.pm使う前提で例外に
しちゃうとか。
■ このスレッドは過去ログ倉庫に格納されています