2011-01-19 1 views
0

빠른 질문입니다. 변수에 대해 완전히 잘못하고 있다고 확신하지만, 여기에 문제가 있습니다. 첫째Perl : 파일에 추가하고 새로운 행 수를 얻으십시오.

코드 :

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

나는 파일이 작성되고 추가되고 있음을 확인했습니다. 누군가가 올바른 방향으로 변수를 설정하고 업데이트 한 다음 다시 제대로 호출하는 방법을 알려줄 수 있습니까?

답변

2

변수가 아닌 하위를 호출합니다.

시도 : 변수가 당신이 당신의 서브를 호출 할 때마다 업데이트되도록

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

... 

    print "Current Lines In File: ", CurrentLinesCount(), "\n"; 
+0

'return $ CurrentLinesCount;'(실제 함수에'wc -l' 부분을 배치하는 것에 대한 답변이 오기 전에 코드를 변경 한 후에) 해결했습니다. – drewrockshard

1

wc 번만 전화를 걸고 있습니다. 따라서 $CurrentLinesCount 값을 한 번 설정하면 두 번 인쇄 할 때 동일한 번호가 표시됩니다.

당신은 당신이 파일에 추가 한 후

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

라인을 다시 실행해야합니다.

편집 : 또는 아마 더 나은 곳이 될 것 GetStatistics 기능에서 그 라인을 넣어.

0

아마, 코드 블록 GetStatistics 서브 루틴에

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

이동합니다.

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,하지만 난이 결과의 프로그램이 아닙니다 가정합니다. 다른 한편, 글로벌은 습관성을 형성 할 수 있습니다.

줄을 계산할 때 마지막 "\ n"다음에 wc는 아무 것도 계산하지 않습니다 ("\ n"은 줄 종결 자로 간주 함). 줄 구분자로 "\ n"을보고 줄 문자를 줄로 계산하려면 counting lines의 다른 방법이 필요합니다.