Как посчитать количество символов в файле после определения начальной точки? - PullRequest
0 голосов
/ 05 августа 2009

Я хочу посчитать количество символов после того, как выяснил начальную точку.

__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";
}

Ответы [ 7 ]

1 голос
/ 05 августа 2009

Также будут подсчитаны символы в тегах начальной точки:

#!/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
1 голос
/ 05 августа 2009

Это своего рода надуманный ответ, но вопрос (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 голосов
/ 05 августа 2009

Назовите меня сумасшедшим, но этот вопрос кажется специально для оператора триггер :

#!/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 символов. Реализация условия в теле триггера для их пропуска оставляется в качестве упражнения для читателя, так как в этом случае настолько специально для триггера, что я не могу избавиться от ощущения, что это может быть чья-то домашняя работа.)

0 голосов
/ 05 августа 2009

До сих пор нет ясности в отношении того, что должна делать программа, поэтому существует еще одна реализация того, чего может не хотеть автор.

#!/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 голосов
/ 05 августа 2009
while (<>) {
    chomp;      # strip record separator
    if (/^2/) { print $t;  last; }
    if (/^1/) { $f = 1; }
    if ($f) { $t += length($_); }
}

, тогда код выше выведет итоговое значение .. если вы хотите напечатать итоговое значение каждой строки, напечатайте его в третьем блоке «если»

выход

# ./test.pl file
229
0 голосов
/ 05 августа 2009

Это немного громоздко, но, возможно, вы или кто-то еще можете избавиться от необходимости печати после цикла:

#!/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
0 голосов
/ 05 августа 2009

Я не мастер 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";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...