Perl, считать символы и разбивать в конце слова - PullRequest
2 голосов
/ 19 января 2012

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

foreach (@$comp) {
    my $c = $_;
    $c->{reviews} = ($c->{reviews} - 1);
    my $stars;
    if($c->{reviews} == 0) {
        $stars = 0;
    } else {
        $stars = int($c->{reviews_total} / $c->{reviews});
    } 
    $c->{stars} = $stars; 

    if($c->{title}) { 
        $c->{name} = $c->{title}; 
        $c->{event} = "FOO"; 
    }
    $c->{description} =~ s/BREAK//g; 

    my (@desc) = split(//, $c->{description});   

    my $adesc;
    my $rowc = 0;
    my $count = 0;

    while($count < 300 ) {
         $adesc .= @desc[$count];
         $rowc++;
         $count++;
    }

    $c->{description} = $adesc;= '...';
}

Ответы [ 4 ]

9 голосов
/ 19 января 2012

Посмотрим, что скажет perldoc perlfaq4:

Как переформатировать абзац?

Используйте Text::Wrap (часть стандартного дистрибутива Perl):

use Text::Wrap;
print wrap("\t", '  ', @paragraphs);

абзацы, которые вы передаете Text::Wrap, не должны содержать вложенных переводы строк. Text::Wrap не выравнивает строки (справа налево).


Но что, если вам это не нравится?

Визит CPAN

3 голосов
/ 19 января 2012

Как насчет:

my $str = q!A very long string to be wrapped on whitespace!;
my $len = 15; #for test. In your case, let $len=300
my @l = grep{s/^\s+//;$_ ne ''}split(/(.{1,$len})(?=\s)/, $str);
dump@l;

Вывод:

("A very long", "string to be", "wrapped on", "whitespace")
0 голосов
/ 19 января 2012
perl -nwE 'say for m/(.{0,75} )/g' textsample2.txt
HAMLET: To be, or not to be--that is the question: Whether 'tis nobler in
the mind to suffer The slings and arrows of outrageous fortune Or to take
...

Работает как шарм. Если в вашем тексте нет очень длинных слов, просто подправьте цифры.

Конечно, сначала вам придется удалить все старые разрывы строк. Итак, что-то вроде:

sub wrap_text {
    my ($text, $len) = @_;
    $text =~ s/[\r\n]+//g;  # yeah, removing \r while at it
    return ( $text =~ m/(.{0,$len} )/g );
}

А потом:

say for wrap_text($text, 300);
0 голосов
/ 19 января 2012

Вы можете использовать:

$str = "my big string blah blah...";
for ( $i = 300; substr( $x, $i, 1 ) =~ /\w/; $i++ ) { };
$str = substr( $str, 0, $i );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...