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

変数ではなくサブルーチンを呼び出します。

試す:

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

への呼び出しはwc1 回だけです。したがって、$CurrentLinesCount1 回の値を設定していて、2 回印刷すると同じ数値が得られます。

やり直す必要があります

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

ファイルに追加した後の行。

編集:または、その行をGetStatistics関数に入れます。これは、おそらくより適切な場所です。

于 2011-01-19T20:05:54.540 に答える
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 に答える
0

おそらくコードブロックを移動します

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

GetStatistics サブルーチンに追加されるため、サブルーチンを呼び出すたびに変数が更新されます。

于 2011-01-19T20:07:34.867 に答える