Perl: добавить в файл и получить новый счетчик строк - PullRequest
0 голосов
/ 19 января 2011

Быстрый вопрос, и я уверен, что я что-то не так делаю с переменными, однако здесь есть проблема.

Сначала код:

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

2 голосов
/ 19 января 2011

Вы вызываете подпрограммы, а не переменные.

Попробуйте:

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

...

    print "Current Lines In File: ", CurrentLinesCount(), "\n";
1 голос
/ 19 января 2011

Вы звоните на wc только один раз. Таким образом, вы устанавливаете значение $CurrentLinesCount один раз, и вы получаете тот же номер, когда вы печатаете его дважды.

Вам придется повторить

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

строка после добавления в файл.

Редактировать: Или поместить эту строку в функцию GetStatistics, которая, вероятно, будет лучшим местом для нее.

0 голосов
/ 19 января 2011

В качестве оптимизации вы можете посчитать, сколько строк вы добавили, а не пересчитывать весь файл (если только другой процесс не может также записывать в файл).

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

0 голосов
/ 19 января 2011

Я бы, вероятно, переместил кодовый блок

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

в подпрограмму GetStatistics, поэтому переменная обновляется всякий раз, когда вы вызываете вашу подпрограмму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...