アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。

掲示板をperlで作るという課題に取り組んでいるのですが、下記の部分の
動きだけがどうしても期待する動作がえられず、困っています。
なにか試した方が良い事がありましたら、ご指摘いただけないでしょうか。

プログラムの説明:
POST されたコメントを data.dat に追記していくプログラムです。
ファイルハンドラから一行づつ読み込んで、行数を $count でカウントし、
『X行目&&コメント』のようにコメントの先頭に行数を表示します。


#!/usr/bin/perl
$myfile = 'data.dat';

(省略)

sub piyo{
open(HOGE, ">> $myfile");
flock(HOGE, 2);
my $count = 1;
while(<HOGE>){
$count++;
};
print HOGE "$count行目&&in{'comment'}\n";
close(HOGE);

};


data.dat の期待する結果は下記です。

1行目&&コメント
2行目&&コメント
3行目&&コメント
.....

実際に data.dat に書き込まれた結果は下記でした。

1行目&&コメント
1行目&&コメント
1行目&&コメント
.....


試した事1:
open(HOGE, ">> $myfile");

open(HOGE, "+>> $myfile");
した。

試した事2:
while(<HOGE>){
$count = $count + 1;
};
とした。


どちらでも結果に違いがありませんでした。


よろしくお願いします。

A 回答 (3件)

+>>をご使用なので、ファイルハンドラが最後に移動してないでしょうか。


ハンドラが最後に移動しているので、whileは実行されておらず、常にファイル末尾に1行目が出力されるというシナリオを想像します。

Perlfaqを使用して…

$lines = 0;
$filename = "yahho.txt";
open(FILE, "+<$filename") or die "Can't open `$filename': $!"; #open に+<を使用
while (sysread FILE, $buffer, 4096) {
$lines += ($buffer =~ tr/\n//);
print "p";
}
print FILE ++$lines . "やっほ~\n";

注意 open時にファイルの存在は保証してください。存在しない場合エラーです。
    • good
    • 0
この回答へのお礼

hirotn 様

ご指摘のとおりでした。ありがとうございました。

お礼日時:2013/07/05 19:07

当該Perlfaqは以下のURLです。


http://perldoc.jp/docs/perl/5.14.1/perlfaq5.pod

「あるファイルの行数を数えるには」 が該当します。

数えた後はファイルハンドラは終端になっているのでご希望の処理を追加するようにしています。
    • good
    • 0
この回答へのお礼

こういったサイトをまず最初に確認すべきなのですね。
教えていただきありがとうございます、次回からまずは perldoc から情報を探してみます。

お礼日時:2013/07/05 19:13

open(HOGE, ">> $myfile");


は「追加書き込み」モードでファイルを開きます。

while(<HOGE>){
で「読む」ことができるでしょうか?
    • good
    • 0
この回答へのお礼

kmee 様

ご返信ありがとうございます。

+>> でも試してみたところ意図通りに動かなかったのですが、
+> だと期待する動作が得られました。
細かな違いまで意識が及んでおらず、気がつけておりませんでした。

コメントありがとうございました。

お礼日時:2013/07/05 19:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!