0

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

先上代码:

#!/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();

这是我得到的输出:

文件中的当前行:258
文件中的当前行:258

我验证了该文件正在被写入并附加到。有人可以为我指出正确的方向,了解如何设置、更新和正确调用变量吗?

4

4 回答 4

2

您调用 subs,而不是变量。

尝试:

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

...

    print "Current Lines In File: ", CurrentLinesCount(), "\n";
于 2011-01-19T20:06:38.227 回答
1

你只调用wc一次。因此,您设置了$CurrentLinesCount一次的值,并且在打印两次时得到相同的数字。

你必须重做

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

追加到文件后的行。

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

于 2011-01-19T20:05:54.540 回答
0

我可能会移动代码块

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

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

于 2011-01-19T20:07:34.867 回答
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);

对我来说仍然有太多的全局变量,但我想这不是一个重要的计划。另一方面,全局变量可能会形成习惯。

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

于 2011-01-19T20:29:37.220 回答