2011-01-19 75 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 2011-01-19 20:25:01

1

您只需撥打wc一次。因此,您只需設置$CurrentLinesCount的值,並在打印兩次時獲得相同的編號。

您將擁有附加到文件後,重新進行

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

線。

編輯:或將該行放在GetStatistics函數中,這可能是一個更好的地方。

0

我可能會移動代碼塊

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

到GetStatistics子程序,所以變量被更新時,你打電話給你的子。

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); 

還是太多了globals對我的口味,但我想這不是後果的程序。另一方面,全局可以成爲習慣。

請注意,在對行進行計數(它將「\ n」視爲行終止符)時,wc在最後一個「\ n」後面不計算任何內容。如果要將「\ n」作爲行分隔符並將這些尾隨字符計爲一行,則需要使用另一種方法counting lines