トップページ⇒php
984コメント309KB

【Perl】初心者コーナーPart11

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/03/27 12:53ID:wAXxxOxP
 
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけどなんか質問ある Pert 5.01 】
http://pc.2ch.net/test/read.cgi/php/1015127347/l50
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
0345nobodyさん02/04/09 07:34ID:???
>340
$&は危険
s/([<>]|&[lg]t;)/$conv{$1}/g;

>342
負数のほうが簡潔
push @new, splice(@list, -2, 2);
0346やさしいお兄さん02/04/09 07:37ID:???
気になって、一応ベンチとってみました。意外な結果が...
できるだけループ数を多くして3回とってみたらいずれも340のほうが速かったです。
つまり、[lg] よりも (?:l|g) のほうが速いという結果でした。

Benchmark: timing 100000 iterations of 340, 343...
     340: 12 wallclock secs (11.21 usr + 0.00 sys = 11.21 CPU)
     343: 12 wallclock secs (11.43 usr + 0.00 sys = 11.43 CPU)
0347nobodyさん02/04/09 07:48ID:???
[lg]と(?:l|g)の比較なんかよりも、$&を使う罪に気付けよ。
まだ間に合うから、修行しなさい。
0348nobodyさん02/04/09 07:59ID:???
>>346
そのベンチ結果だと誤差の範囲だな。
0349やさしいお兄さん02/04/09 08:10ID:???
>348
でも以外でしょ?
0350nobodyさん02/04/09 09:46ID:???
スライスじゃダメなのか。
@new = @list[ 4, 5 ];
0351nobodyさん02/04/09 10:34ID:???
元の配列を 変えたい/変えたくない で決まるね
0352nobodyさん02/04/09 10:44ID:???
すみません。いきなりの質問です。

Perlソースのテンプレートが欲しいのです。
ラマとラクダがまだ家に来てくれないので欲しいのです。

第一引数でフォルダを指定して、
そのフォルダ下にある全ファイルを読み込んで処理する
テンプレが欲しいのです。

ファイル処理をする関数名はdo_file
で、そこは私が作るんで。テンプレおねがいします。
0353☆02/04/09 10:51ID:???
バナーをクリックした時に$datatext(テキストファイル)の中の
そのバナーのカウントが1プラスされるようにしたいんですが、うまくいきません。
以下の構文でどこか間違っている個所があれば教えて頂きたいのですが、、
ちなみにQUERY_STRINGと$read_data[1]はリンク先URLです。

#バナーをクリックした時
if($ENV{'QUERY_STRING'} eq "$read_data[1]")
{
open (DATA,$datatext);
@data = undef;
@read_data =();
@data = <DATA>;
close DATA;
for($i = 0;$data[$i];$i++)
{
@read_data = split(/\t/,$data[$i]);
$read_data[4]++; #4列目はリンクカウント数
$lastdata[$i] = "$read_data[0]"."\t"."$read_data[1]"."\t"."$read_data[2]"."\n";
}

open(WRITE,">$datatext");
print WRITE "@lastdata";
close WRITE;
print "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=$ENV{'QUERY_STRING'}\">\n";
exit;
}
0354nobodyさん02/04/09 10:52ID:???
>352
キミは最初に質問と言っておきながら、いつの間にかクレクレ君に大変身ですか?
0355☆02/04/09 10:56ID:???
353です。

あ、すいません。構文間違えました
#4列目はリンクカウント数とかかれている部分、

$read_data[2]++;

で、2列目の間違いです。
035635202/04/09 11:07ID:???
>>354
<>とか、きっとそういうのを使うとは思うんですが…
どうかおねがいします。教えてください。
ペコリm(_ _)m o0(いつのまにか…というより、もとよりそのつもりでしたが何か?
)
0357やさしいお兄さん02/04/09 11:19ID:???
>355
これでどうでしょうか?動作確認はしておりませんが...

if ( $ENV{'QUERY_STRING'} eq $read_data[1] ){
    open(DATA, $datatext);
    while (<DATA>){
        @read_data = split(/\t/);
        $read_data[2]++;
        push(@lastdata, join("\t", @read_data)."\n");
    }
    close DATA;
    open(WRITE,">$datatext");
    print WRITE @lastdata;
    close WRITE;
    print qq(<META HTTP-EQUIV="Refresh" CONTENT="0;URL=$ENV{'QUERY_STRING'}">\n);
    exit;
}
0358nobodyさん02/04/09 11:27ID:???
>356
最初に質問というのなら、具体的にどこの記述でいきづまっているのか、
具体的なコードを明示すべきだろ。
それもしないでおきながら調子のいいこと言って自分を正当化すんじゃねーよ!
0359☆02/04/09 11:30ID:???
>>357
どうもです。
でもそれで実行して再読み込みすると、データテキストに無限に数字が書き込まれてるんですが・・

それ以前の部分の処理が悪いんでしょうか?
0360nobodyさん02/04/09 11:59ID:???
>>353 ifの判定文の@read_dataとifブロック中の@read_dataはバッティングしていないのか?
0361nobodyさん02/04/09 12:06ID:???
>352=>356

>いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
>
>1:自分はこう言う事がしたい。
>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
>
>1と3が無いと誰も答えられないよ、良い回答は良い質問から。
>一緒に勉強しましょう。
0362やさしいお兄さん02/04/09 12:09ID:???
>359
そうですよね。処理の内容を考えずに書いてしまいました。チョット
データファイル内容がよくわからないのですが、リンク先URLはあらかじめ
データファイルに設定されているということならば以下のような感じかなと。

open(DATA, $datatext);
while (<DATA>){
chop;
@read_data= split("\t");
$read_data++ if $ENV{'QUERY_STRING'} eq $read_data[1];
push(@last_data, @read_data);
}
close(DATA);
open(WRITE,">$datatext");
for ( @last_data ){
print WRITE $_,"\n";
}
close WRITE;
print qq(<META HTTP-EQUIV="Refresh" CONTENT="0;URL=$ENV{'QUERY_STRING'}">\n);
exit;
0363やさしいお兄さん02/04/09 12:20ID:???
>362
まちがってしまいました。ごめっ。

$read_data[2]++ if $ENV{'QUERY_STRING'} eq $read_data[1];
0364やさしいお兄さん02/04/09 12:31ID:???
>362
またまちがってた。頭冷やしてきまーす。

push(@last_data, join("\t", @read_data));
0365☆02/04/09 12:42ID:???
>>364
ありがとうございます。
アクセス数の書き込みはうまく行きました。

でも今度はCGIにアクセスすると自動的に何度も何度もリロードされます。
0366やさしいお兄さん02/04/09 12:54ID:???
>365
より速く処理をするために以下の書き方もアリだと思います。
常に以下のメタタグを返す処理ならば何度もリロードになるでしょう。
最終的にどうしたいの?

open(DATA, $datatext);
while (<DATA>){
@read_data= split("\t");
$ENV{'QUERY_STRING'} eq $read_data[1] ? ($read_data[2]++,push(@last_data, join("\t", @read_data)."\n")) : push(@last_data, $_);
}
close(DATA);
open(WRITE,">$datatext");
print WRITE @last_data;
close WRITE;
print qq(<META HTTP-EQUIV="Refresh" CONTENT="0;URL=$ENV{'QUERY_STRING'}">\n);
exit;
0367☆02/04/09 12:58ID:???
>>366
最終的にはバナーの一覧を表示させたいんです。
0368やさしいお兄さん02/04/09 13:01ID:???
>366
$ENV{'QUERY_STRING'} にこのCGI自身がしていされていれば、
何度もこれを繰り返すの間違いでした。
0369☆02/04/09 13:09ID:???
バナーは
<a href="banner.cgi?http://www.yahoo.co.jp/"><IMG SRC="banner.gif"></a>
のようになっていて、
バナーをクリックした時にこのサブルーチンが動くようにしたいんです。

すなわちbanner.cgiに直接アクセスした時には
バナー一覧だけが表示される、という形です。
0370nobodyさん02/04/09 13:11ID:B5CaElBB
open (SET,"+>$PATH");
my @setting = <SET>

と書いたんですが、@settingには何も入ってないみたいなんです。

open (SET,"$PATH");
my @setting = <SET>
close (SET);
open (SET,">$PATH");

ならできるんですが、、、
0371やさしいお兄さん02/04/09 13:12ID:???
>368
以下のようにして、メタタグをコメントにしてみては?
URL一覧かバナー画像かどちらか必要ないほうもコメントで。

while (<DATA>){
@read_data= split("\t");
print qq(<A href="$read_data[1]">$read_data[1]</A>\n); # URL一覧なら
print qq(<img src="$read_data[0]"><BR clear=all>\n); # バナー画像なら
$ENV{'QUERY_STRING'} eq $read_data[1] ? ($read_data[2]++,push(@last_data, join("\t", @read_data)."\n")) : push(@last_data, $_);
}
0372やさしいお兄さん02/04/09 13:17ID:???
>369
@read_data= split("\t");の直後に以下を書くということかな?

print qq(<a href="banner.cgi?$read_data[1]"><IMG SRC="$read_data[0]" border=0></a><BR>\n);
0373☆02/04/09 13:23ID:???
>>372
いやいやいや、バナー表示のHTMLは別の所にあるんです。
このクリック数カウントの部分だけをsub countというサブルーチンで
呼び出したいんです。

クリック数を得るためリンクが「banner.cgi?〜」となっているんですが、
バナーをクリックするとbanner.cgiに飛んでしまう。
だからbanner.cgi?〜
           ↑ここの値、すなわち$ENV{'QUERY_STRING'}が存在する時、
このサブルーチン&count; を起動させたいわけです。
0374やさしいお兄さん02/04/09 13:27ID:???
>370
+> だと、いきなりファイルが空になってしまいます。

open (SET,"+<$PATH");
my @setting= <SET>;
0375やさしいお兄さん02/04/09 13:33ID:???
>373
なんとなくわかってきました。以前の処理を以下のブロックに入れるということかな?
勿論、メタタグは無しということで。スクリプトの最初のほうがいいかな。

if ( $ENV{'QUERY_STRING'}=~ /http:/ ){

exit;
}
0376nobodyさん02/04/09 13:34ID:B5CaElBB
>>374
どうもです。
読み込みはできましたが、書き込みが追加になってしまうのを上書きにしたいんですけど、
読み込み&上書きは一度にできないんでしょうか?
0377やさしいお兄さん02/04/09 13:35ID:???
>375
チョットまずいかな、いかのようにしたほうがよかった

if ( $ENV{'QUERY_STRING'}=~ /^http:\/\// ){

exit;
}
0378やさしいお兄さん02/04/09 13:37ID:???
>376
seek(SET, 0, 0); # これではじめのほうに巻き戻すナリ!
0379やさしいお兄さん02/04/09 13:39ID:???
>378
truncate(SET, 0); # これも必要だね。
0380nobodyさん02/04/09 13:42ID:B5CaElBB
>>378-379
できました!
お付き合いどうもありがとうございました。
0381☆02/04/09 13:44ID:???
>>377
ありがとうございます!!
これでとりあえずバナーをクリックした時にURLにジャンプするようになりました。

しかしbanner.cgi自体をリロードすると、
datatextの中のデータとかバナーの数がどんどん増えていってしまいます。
0382やさしいお兄さん02/04/09 13:58ID:???
>381
たしか、サブルーチンにして呼び出すということなので、
@last_data をさいしょのほうで初期化するのをわすれていました。
1どの処理でこのルーチンを複数回呼び出すとどんどん増えていきますね。

@last_data= ();
または
@last_data= -1;
または
@last_data= undef;
または
undef @last_data;

0383やさしいお兄さん02/04/09 14:12ID:???
>382
うそを書いてしまいました。

@last_data= ();
または
$#last_data= -1;
または
undef @last_data;

0384nobodyさん02/04/09 14:41ID:???
>>383 CSSもケアしたれや。
0385☆02/04/09 15:05ID:???
>>383
3つバナーがあったとすると、1つクリックした時に
全ての数値が上がるんですが・・
0386邪魔02/04/09 15:17ID:???
全部解決してもらおうと思うなよ。
自分で努力しろよ。
0387やさしいお兄さん02/04/09 15:33ID:???
>385
うーん。いまひとつ全体がぼやけてしまったので。できればどこかにテキスト
ファイルとしてアップしてURLを書いてもらえれば、全体の動きがつかめやすい
のですが、そのCGIではバナーの表示やカウントアップ、そのほかどんな処理を
しているのか?? チョット混乱してきました。
038830602/04/09 15:34ID:???
>340,345
うまくできました。ありがとう御座いました。
0389☆02/04/09 16:19ID:???
>>386
くたばれボケ!!
0390nobodyさん02/04/09 16:22ID:???
386=389 ジサクジエン カコワルイ
0391 02/04/09 17:41ID:h5pnnRRd
ども
パッケージについてお聞きします
いままでサブルーチンしかつかったことがないのですが
パッケージのほうがよい処理がありましてパッケージにサブルーチンを移そうとしてるんです
でもそのまんまコピペだとうまく動いてくれません。
本とか見ても最初の宣言の仕方だけで
やってはいけないこととかでてなくて困っています。
特にお聞きしたいのはパッケージ中でjcode.plなどを呼び出していいのか
変数の定義をパッケージ内でしていいのか、ファイル読み込んでいいのかなどです。
もしかしてそういうことするためにパッケージってあるんじゃないのかもしれませんが
教えてください。

本には
package PacTest ;
use Exporter ;
@P_TEST::ISA = ('Exporter');
@P_TEST::EXPORT = ('subtest');

sub subtest(){}
1;
ここまでしかでてなくて・・・
0392nobodyさん02/04/09 18:01ID:???
>パッケージ中でjcode.plなどを呼び出していいのか
ok
>変数の定義をパッケージ内でしていいのか
ok
>ファイル読み込んでいいのか
ok

他に何か。
0393 02/04/09 18:10ID:h5pnnRRd
>>392
ありがとうございます。
う〜む、そしたらなぜコピペで動いてくれないんだろう・・・
パッケージを使うときのタブーみたいなものありますか?
0394nobodyさん02/04/09 18:18ID:???
P_TEST::って何?
@ISA = ('Exporter');
@EXPORT = ('subtest');
0395 02/04/09 19:17ID:h5pnnRRd
@PacTest::ISAのまちがいです。
ここに書くためにかきなおしたんですがそのまちがいです
0396nobodyさん02/04/09 19:54ID:???
>>395
タブーがないのがPerlって気もするが…
「コピペで動いてくれない」ってコピペしたコードがuse PacTest;でエラーが出るって事か?

ところで話はずれるが@ISAとかにパッケージ名書くより
use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter);
@EXPORT = qw(subtest);
の方が一般的な気がする。ourとuse baseでもいいけど。
0397 02/04/09 20:00ID:h5pnnRRd
>>396
本にでてたやり方なんですけどね
秀和だめですね
039839602/04/09 21:03ID:???
スタイルの違いだからそこはまあいいんだけど、
それより俺が聞きたいのはどうやったらエラーが出たのかという状況説明なんだが
0399 02/04/09 21:31ID:h5pnnRRd
>>398
ウェブマスターに聞けエラーです
0400nobodyさん02/04/09 21:45ID:???
ローカルでやれよ
0401nobodyさん02/04/09 22:12ID:???
>>399
やれやれ・・・
「秀和だめですね」かよ・・・
0402 02/04/09 22:42ID:h5pnnRRd
>>401
技術評論社は(゚∀゚)イイ
ソフトバンクは(´・ω・`)ショボーン
0403貴様ら教えて下さい02/04/09 22:45ID:sR6b9WNM
仕事でPerl使ってメールマガジン配信することになったんですが、
最終的には数万人規模のものにするらしいんです。(無理くせーけど。
普通にsendmailで送るのは無理っぽいですし、
どうしていいものかサッパリわかりません。

皆様ならどうやるでしょう?
0404nobodyさん02/04/09 22:47ID:???
>>403
普通にsendmailで送れ。以上。
0405nobodyさん02/04/09 23:56ID:???
http://www.fml.org/
0406貴様ら教えて下さい02/04/10 00:47ID:RNZ++qE3
マジ?sendmail数千回呼び出すの?
あ、それともBccで数万件指定するのか?
いけるのか?
どうなのか?

>>405
お、使えるかも。
ちょっと見てみる。
0407nobodyさん02/04/10 00:54ID:???
Net::SMTP
0408nobodyさん02/04/11 02:06ID:8LiumuzI
ちょっと教えてください。
単純にファイルから数字を読んで、1足して書き込むようなプログラム
(アクセスカウンタみたいな感じ)を作りたいのですがうまくいきません。
どうやら読み書き両用オープンがうまくいってないみたいなんです。

open(FILE,"+> data.txt");
$x=<FILE>;
print $x;
exit;

試しに上のようにすると、なぜか何も標準出力に出力されません。

open(FILE,"data.txt");
$x=<FILE>;
print $x;
exit;

これだと、ちゃんとファイルの中身が標準出力に出力されます。

どうしてなんでしょう?
環境は WINDOWS XP + Active Perl です。
よろしくお願いしますm(_ _)m
0409nobodyさん02/04/11 02:31ID:???
>>408
>open(FILE,"+> data.txt");
この瞬間、データが消えていることに気付いてください。
0410nobodyさん02/04/11 02:49ID:???
>408
この前もまったく同じ質問があったが、過去レスとか見てる?
+> だといきなりファイルが空になるゾ!

+< で読み込んで
seek(FILE, 0, 0); で巻き戻して
truncate(FILE, 0); でファイルを空にした上で書きこむ
0411nobodyさん02/04/11 07:32ID:???
>>408
ちなみに、>>370ね。
(あまりに質問が似ているので、ネタかと思った・・・)
0412nobodyさん02/04/11 08:32ID:8LiumuzI
激しく既出にも関わらず、ご親切に教えてくださってありがとうございます☆

本などで「+>」は「読み書き両用オープン」って説明されていますが
実際には「書き」しかできないってことですか?(オープンした瞬間データ消えるから)
0413nobodyさん02/04/11 09:27ID:???
>>412
んなこたぁない。ちゃんと読める。
「書いた直後に読みたい」場合に使える。
0414nobodyさん02/04/11 11:06ID:QakPtgEu
http://www.activestate.com/�d�j?
0415nobodyさん02/04/11 12:56ID:???
412ではないが、
実際には「書き」しかできないってことですか?
これ前から気になってた。
413の答えで納得した。
でも「書いた直後に読みたい」なんて思った事ないな、、
0416nobodyさん02/04/11 14:27ID:???
>>415
だから実際に'+>'や'+>>'がつかわれることはほとんどない。
0417nobodyさん02/04/12 01:00ID:???
すいません、ファイルハンドルをハッシュに入れたまま
使用したいのですが、STDIN が思うように動きません。
STDOUT は >>171, >>181, >>184 を参考にしてできたのですが、
<> を使う時はルールが違うのですかね。
わかる方教えて頂けませんでしょうか?

#!/usr/local/bin/perl -w
my %hash = ( in => \*STDIN, out => \*STDOUT );
while (< {$hash{in}} >) { # <= ココが STDIN の置き換えにならない
 print {$hash{out}} $_;
}
exit 1;

出力結果は GLOB(0x8103460) のみです。
0418nobodyさん02/04/12 02:10ID:???
>>417
グローバルなものをなぜハッシュに入れるのかは敢えて聞かないとして・・・
$tmp = $hash{in};
<$tmp>
とスカラーに格納すれば大丈夫みたい。
ハッシュや配列の形ではだめだった。
$tmpは間接ファイルハンドルと解釈するが、$hash{in}はファイル名グロブに
解釈される仕様のようです。試しに次のような使い方は正常に機能した。
$t{a} = "*.txt";
@txt = <$t{a}>;

ということで、スカラー変数を使いましょう。
041941702/04/12 02:54ID:???
>>418
わざわざ試して頂いて有難う御座います。
実はサブルーチンへ値を渡すのにハッシュを使っていたのですよ。

個人的に STDIN と STDOUT は同じルールで使って行きたい
ですので、実際にはこういう感じで使いましょうかねぇ。

#!/usr/local/bin/perl -w
package main;
exit &main;

sub main {
 $ARGV[0] && open(STDIN, $ARGV[0]);
 $ARGV[1] && open(STDOUT, "> $ARGV[1]");
 return &func(in=>\*STDIN, out=>\*STDOUT);
}

sub func {
 my %init = (in => \*STDIN, out => \*STDOUT, @_);
 my ($in, $out) = ($init{in}, $init{out}); # <= ●
 while (<$in>) { print $out $_; }
 return 1;
}

貰った値の正当性を、関数側でチェックしてから使うルールなら
そんなに無駄な処理でもない・・・あ、でも結局ファイルハンドルか。
0420nobodyさん02/04/12 03:07ID:???
exit(1)か・・・ハァ・・・
042141702/04/12 03:47ID:???
>>420
unix の ping コマンドとかは正常終了が 0 ですよね。
他のも一律で 0 に決まってるモンなんでしょうか。
web で 1 を見かけたので真似しだしたんですよ。最近。
スレ違いすみません。

0422stdlib.h02/04/12 04:20ID:???
真似すんなよ。
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
042341702/04/12 04:44ID:???
>>422
ありがとうございます。そうか、ライブラリのヘッダか (汗

まだ、解らない事があっても、それを調べる方法さえ解らない
程度の知識ですので、つい真似というか見習ってしまうのですよ。
反省。ちなみに ping の戻り値も知ったのは jman からですしねぇ。
0424nobodyさん02/04/12 05:01ID:???
>423
perldocの使い方・読み方覚えるがキチ。
042541702/04/12 06:30ID:???
>>424
情報有難う御座います。早速やってみました。

% perldoc perlfaq | less
> perlfaq 砌requently asked questions about Perl ($Date:
> 1999/05/23 20:38:02 $)
> Very general, high碎evel information about Perl.
> 瞰hat is Perl?

なんかウチの環境だと文字化けする上、表示に 22sec もかかる・・。
あ、perldoc -f use とかなら化けない。
しかし英語ばかりで頭痛いですねぇ。

Perlドキュメントの読み方
http://member.nifty.ne.jp/hippo2000/perltips/podread.htm
perldoc
http://yuri.sakura.ne.jp/~propella/tips/perldoc.html

今までリスト化されて読みやすい下記サイトを聖書と崇めてましたが
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_toc.html
最新版には perlpod なんて項目があったのですね。
http://www.kt.rim.or.jp/~kbk/perl5.005/index.html
.pm の中身とかを見て、ずっと頭を悩ましていましたよ。
0426nobodyさん02/04/12 07:09ID:???
最近この板でバカな奴みるとDream★じゃないかと疑ってしまう。
0427nobodyさん02/04/12 07:22ID:???
.>>426
アハハ
0428nobodyさん02/04/12 09:06ID:???
おい、<$h{in}>で困ってたやつ。下のコード試してみろ:
readline($h{in)

0429nobodyさん02/04/12 15:57ID:XFr3wilJ
うるせんだよヴぉけ!!!!!!!!!!!!!!!!!!!!!!!
043041702/04/12 19:35ID:???
>>428
ホントだ、できましたよ。有難う御座います。
しかし perldoc では説明でましたが、web 上に散乱するサイトの
日本語マニュアルには全然載っていない関数みたいですね。なんでだろ。
0431nobodyさん02/04/12 20:10ID:???
すいません、こういう事ってどうすればよいのでしょうか。。
ダウンロード用のCGIを作っているのですが、ログ形式が

日付<>ファイル名<>総DL数<>LZHのDL数<>ZIPのDL数

となっているログのファイル名が同じの総DL数、LZHのDL数、ZIPのDL数
をそれぞれ足したものを表示されるにはどうすればよいのでしょうか。
総DL数だけならハッシュ使えば出来ると思うのですが。

具体的には
20020423<>test<>5<>2<>3
20020423<>test1<>5<>2<>3
20020424<>test<>6<>3<>3
20020424<>test1<>8<>5<>3
を
test,11,5,6
test1,13,7,6
みたいな感じで出力したいのですが。
0432nobodyさん02/04/12 21:00ID:???
>>431

my %count;
while (<DATA>) {
chomp;
my ($date,$name,$all,$lzh,$zip) = split /<>/;
$count{$name}{all} += $all;
$count{$name}{lzh} += $lzh;
$count{$name}{zip} += $zip;
}
foreach (keys %count) {
print join ',',$_,$count{$_}{all},$count{$_}{lzh},$count{$_}{zip},"\n"
}
<>;
__END__
20020423<>test<>5<>2<>3
20020423<>test1<>5<>2<>3
20020424<>test<>6<>3<>3
20020424<>test1<>8<>5<>3
0433nobodyさん02/04/12 21:02ID:???
訂正
},"\n"
↓
} ."\n"
0434nobodyさん02/04/12 21:46ID:4zjuzdoC
数千行あるログファイルから
特定の位置だけを表示したい場合のスマートな方法ってどんなですか?

自分の場合は
単純に1行目から順に読み出して行って、指定行になったらループを抜ける
もしくは、配列に全部読み込んでから指定範囲だけ取り出す
ってやりかたしてるんですが、いまいちよろしくないです。
ファイルサイズによりますがカナリきついです。

また新着ログはファイルの先頭行に挿入したいのですが、この場合は
いったん全部読み込んで、先頭行にログ追加して、全行書き出す
するしかないのでしょか、、、、
0435nobodyさん02/04/12 21:54ID:???
新着ログだけ書き込んだファイルに
他のファイルを追記で書き込んでリネーム
0436nobodyさん02/04/12 22:31ID:4zjuzdoC
>>435
ほうほう、その方法でためしてみます
やはり最終的には全行を書き出す事になるんですね、がくり。
挿入とかできたら便利なのになぁとか思った
0437nobodyさん02/04/12 22:51ID:???
>>436
それは太古の昔から無理。
なので、ログは先頭に追加せず、おけつに追加していき、
表示する時とかに逆順にしたほうが吉。

もしくは、先頭に追加できるファイルシステムを考案しる。
0438nobodyさん02/04/13 00:09ID:???
といいつつDB_File::DB_RECNOはそこそこ使える。(たまにコケるが)
0439nobodyさん02/04/13 06:55ID:???
教えていただきたいことがあります。

以下の2次元配列において、列部分($data[行][列])の最大インデックスを求める
効率的な方法を何卒、ご教授ください。よろしくお願いします。

一応、以下のようにループで回して比較する方法を考えましたがもっとスマートな
やりかたがありそうな気がしていますがどうしても思いつきません。

$MAX= $#{$data[$_]}> $MAX ? $#{$data[$_]} : $MAX for ($[ .. $#data);
0440nobodyさん02/04/13 08:50ID:???
>432
ありがとうごさいました。うまくできました。
0441ゲーム房02/04/13 10:19ID:jvfE2/Zt
iswebにはFFA設置してもいいんですよね?
でも、「ゲームCGIは禁止」って書いてるんですが・・・。
0442nobodyさん02/04/13 10:28ID:???
>441
誤爆だろうけどスレ違い。
0443nobodyさん02/04/13 11:26ID:???
>>441
しかも日本語が理解できてない。
0444nobodyさん02/04/13 11:28ID:???
>>441
ゲームCGIが禁止ならFFAも禁止に決まってるだろゴルァ!
■ このスレッドは過去ログ倉庫に格納されています