Perl:附加到文件并获取新的行数

时间:2011-01-19 20:01:01

标签: perl text file filehandle

快速提问,我确信这是我对变量完全错误的事情,但是,这就是问题所在。

代码优先:

#!/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

我验证了该文件正在被写入并附加到。有人能指出我正确的方向,如何设置变量,更新,然后再次正确调用?

4 个答案:

答案 0 :(得分:2)

你调用subs,而不是变量。

尝试:

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

...

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

答案 1 :(得分:1)

您只需拨打wc一次电话。因此,您将$CurrentLinesCount的值设置为一次,并且在打印两次时获得相同的数字。

你必须重做

$CurrentLinesCount = `wc -l < $File` or die "wc failed: $?";
附加到文件后

行。

修改:或者将该行放在GetStatistics函数中,这可能是一个更好的地方。

答案 2 :(得分:0)

我可能会移动代码块

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

到GetStatistics子例程,因此每当您调用sub时,变量都会更新。

答案 3 :(得分: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,但我想这不是一个重要的计划。另一方面,全局变量可能是习惯形成的。

请注意,在计算行时,wc在最后的“\ n”之后不计算任何内容(它将“\ n”视为行终止符)。如果您想将“\ n”视为行分隔符并将这些尾随字符计为一行,则需要使用counting lines的替代方法。