В качестве оптимизации вы можете посчитать, сколько строк вы добавили, а не пересчитывать весь файл (если только другой процесс не может также записывать в файл).
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» в качестве разделителя строк и посчитать эти завершающие символы в виде строки, вам потребуется альтернативный метод подсчета строк .