2011-01-19 6 views
0

簡単な質問ですが、私は変数に完全に間違っていると確信していますが、ここに問題があります。最初Perl:ファイルに追加して新しい行数を取得する

コード:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $File = "file.txt"; 
my $CurrentLinesCount = `wc -l < $File` or die "wc failed: $?"; 
chomp($CurrentLinesCount); 

sub GetStatistics() { 
    if (-d $dir) { 
      print "Current Lines In File: $CurrentLinesCount\n"; 
    } 
    else { 
      exit; 
    } 
} 
sub EditFile() { 
    my $editfile = $File; 
    my $text = "1234\n12345\n234324\n2342\n2343"; 
    open(MYFILE,">>$editfile") || die("Cannot Open File"); 
    print MYFILE "$text"; 
    close(MYFILE); 
    sleep 5; 
} 

## MAIN 
GetStatistics(); 
EditFile(); 
GetStatistics(); 

これは私が得る出力されます:

 
Current Lines In File: 258 
Current Lines In File: 258 

私は、ファイルが書き込まれるとに追加されていることを確認しました。誰かが変数をセットし、更新し、そして再び正しく呼び出す方法について、正しい方向で私を指摘できますか?

答えて

2

変数ではなく、subsを呼び出します。

試してください:変数は、あなたのサブを呼び出すたびに更新されるように

sub CurrentLinesCount { 
    my $CurrentLinesCount = `wc -l < $File` or die "wc failed: $?"; 
    chomp($CurrentLinesCount); 
    return $CurrentLinesCount; 
} 

... 

    print "Current Lines In File: ", CurrentLinesCount(), "\n"; 
+0

'return $ CurrentLinesCount;'(実際の関数に 'wc -l'の部分を置くことについての答えが流入する前にコードを変更した後で)解決しました。 – drewrockshard

1

あなたはwcへの呼び出しを1回だけしています。したがって、$CurrentLinesCountの値を1回設定すると、2回印刷するときに同じ数値が得られます。

あなたがファイルに追加した後、

$CurrentLinesCount = `wc -l < $File` or die "wc failed: $?"; 

ラインをやり直す必要があります。

編集:または、その行をGetStatistics関数に入れてください。これはおそらく、より良い場所になるでしょう。

0

私はおそらく、コードブロックGetStatisticsサブルーチンへ

my $CurrentLinesCount = `wc -l < $File` or die "wc failed: $?"; 
chomp($CurrentLinesCount); 

を移動します。

0

最適化として、ファイル全体を再カウントするのではなく、追加した行の数をカウントできます(別のプロセスがファイルに書き込んでいる場合を除きます)。

use strict; 
use warnings; 
use FileHandle; 
use IPC::Open2; 

our $CurrentLinesCount; 
our $file = "file.txt"; 

sub CountLines { 
    my $File = shift; 
    my $CurrentLinesCount = `wc -l < $File` or die "wc failed: $?"; 
    $CurrentLinesCount =~ s/\s+//g; 
    return $CurrentLinesCount; 
} 

sub ShowStatistics { 
    my $file = shift; 
    if (-f $file) { 
     print "Current Lines In File: $CurrentLinesCount\n"; 
    } else { 
     exit; 
    } 
} 

sub EditFile { 
    my $editfile = shift; 
    my $sleeptime = shift || 5; 
    my $text = "1234\n12345\n234324\n2342\n2343"; 
    open(MYFILE,">>$editfile") || die("Cannot Open File"); 
    print MYFILE "$text"; 
    close(MYFILE); 
    # Look here: 
    my $pid = open2(*Reader, *Writer, "wc -l"); 
    print Writer $text; 
    close Writer; 
    $CurrentLinesCount += <Reader>; 
    sleep $sleeptime; 
} 

$CurrentLinesCount = CountLines($file); 
ShowStatistics($file); 
# EditFile updates $CurrentLinesCount 
EditFile($file, 2); 
ShowStatistics($file); 

まだ1あまりにも多くの私の好みのためglobalsが、私は、これは結果としてのプログラムではありませんと仮定します。一方、グローバルは習慣を形成することができます。

wcは行数をカウントするときに最後の "\ n"の後には何もカウントしません(行終端文字として "\ n"を表示します)。行区切り文字として "\ n"を表示し、末尾の文字を1行として数えたい場合は、別の方法のcounting linesが必要です。

関連する問題