2011-01-19 51 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