2009-08-05 59 views
0

我想在計算出開始點後計算字符數。如何計算一個文件中的字符數,一旦找到起點?

__DATA__ 

1-thisthestartingpoint 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
2-nextstartingpoint 
ETCETCETCETCDONOTCOUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINE 

我寫了下面的腳本,但它似乎沒有解決目的。它不會進入字符應該被計數的行,而是給出長度爲1-thisisthestartpoint。有關如何統計正則表達式後面的字符數的任何建議。我對Perl和編程一般都很陌生,所以對我很容易。

open (FILE, "/usr/filename") || die "cant open filename"; 
my @body = <FILE>; 
foreach $_(@body){ 
    last if ($_=~/[2-9]-[a-z]+/); 
    if ($_=~ /1-[a-z]+/){ 
    chomp ($_); 
    push (@value ,split (//,$_)); 
    my $length = @value; 
    print @value; 
    print "\n the length is $length\n"; 
} 
+0

你能舉一個例子輸入和輸出嗎? – Nikhil 2009-08-05 02:01:15

+0

@nikil:輸入與顯示的'Data'相同,對於輸出我只想要字符串的長度'COUNTTHENUMBEROFCHARACTORSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT' – birdy 2009-08-05 02:04:56

回答

0

讀音字沒有perl的嚮導,但你需要在你的循環下一次這樣做,它開始後起始點計數。計算的長度是下一個字符的+1。

#!/usr/bin/perl 
open (FILE, "./abc") || die "cant open filename"; 
my @body = <FILE>; 
foreach $_(@body){ 
    last if ($_=~/[2-9]-[a-z]+/); 
    if ($_=~ /1-[a-z]+/) { $found = 1; next; }; 
    if ($found == 1) 
    { 
     chomp ($_); 
     push (@value ,split (//,$_)); 
     my $length = @value; 
     print @value; 
     print "\n the length is $length\n"; 
    } 
} 
1

這有點做作的答案,但問題是,(IMO)的措辭如此奇怪的是,我不知道我理解這裏的點...

#!/usr/bin/perl 

use strict; 
use warnings; 

chomp(my @lines = <DATA>); 
my $data = join '' , @lines; 

my($string) = $data =~ /1-[a-z]+(.*)[2-9]-[a-z]+/; 

printf "the length is %d\n" , length($string); 

__DATA__ 
1-thisthestartingpoint COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 2-nextstartingpoint 
ETCETCETCETCDONOTCOUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINE 

輸出:

$ ./foo.pl 
the length is 209 
0

這是一個有點麻煩,但也許你或其他人可以在循環之後打印擺脫需求:

#!/usr/bin/perl 

use strict; 
use warnings; 

my ($length, $marker); 

while (my $line = <DATA>) { 
    chomp $line; # decide if you need this 
    if ($line =~ /^([0-9]-\w+)/) { 
     if ($marker) { 
      print "$length characters since $marker\n"; 
     } 
     $marker = $1; 
     $length = 0; 
     next; 
    } 
    $length += length $line; 
} 

print "$length characters since $marker\n"; 

__DATA__ 
1-thisthestartingpoint 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
2-nextstartingpoint 
ETCETCETCETCDONOTCOUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINE 

輸出:

 
E:\Temp> d 
207 characters since 1-thisthestartingpoint 
60 characters since 2-nextstartingpoint 
1

這將算在起點標籤的人物,以及:如果你要打印的每一行的

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $count; 

while (<DATA>) { 
    $count += length if m'thisthestartingpoint' .. m'nextstartingpoint'; 
} 
print "count: $count\n"; 


__DATA__ 

1-thisthestartingpoint 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
2-nextstartingpoint 
ETCETCETCETCDONOTCOUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINE 
0
while (<>) { 
    chomp;  # strip record separator 
    if (/^2/) { print $t; last; } 
    if (/^1/) { $f = 1; } 
    if ($f) { $t += length($_); } 
} 

那麼上面的代碼將打印總..總計,將其打印在第三個「if」塊中

輸出

# ./test.pl file 
229 
0

目前還不清楚程序應該做什麼,因此還有另一種作者可能不想要的東西的實現。

#!/usr/bin/env perl 

use strict; 
use warnings; 

my ($mark, $length); 

while (<DATA>) { 
    if (/^([0-9]-\w+)/) { 
     print "$length after $mark" if $mark; 
     ($mark, $length) = $_; 
     next; 
    } 
    chomp; # may be 
    $length += length; 
} 

print "$length after $mark" if $mark; 
__DATA__ 

1-thisthestartingpoint 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
2-nextstartingpoint 
ETCETCETCETCDONOTCOUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINE 
0

叫我瘋了,但這個問題似乎量身定做的flip-flop operator

#!/usr/bin/perl 

use strict; 
use warnings; 

my $count; 

while (<DATA>) { 
    if (/^1-[a-z]/ .. /^[2-9]-[a-z]/) { 
    chomp; 
    $count += length $_; 
    } 
} 

print "$count characters between markers\n"; 

__DATA__ 
SKIPTHISSKIPTHISSKIPTHIS 
1-thisthestartingpoint 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
COUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINEBEFORETHENEXTSTARTINGPOINT 
2-nextstartingpoint 
ETCETCETCETCDONOTCOUNTTHENUMBEROFCHARACTERSPRESENTINTHISLINE 

(請注意,這個版本計數都在開始和結束標誌,共248個字符返回實施在觸發器的身體內跳過它們的條件是留給讀者的練習,因爲這種情況是所以爲觸發器量身定做,我不能動搖它的感覺,可能是某人的家庭作業)。

相關問題