快速提问,我确信这是我对变量完全错误的事情,但是,这就是问题所在。
代码优先:
#!/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
我验证了该文件正在被写入并附加到。有人能指出我正确的方向,如何设置变量,更新,然后再次正确调用?
答案 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的替代方法。