[Moscow.pm] Парсинг текстовой строки

Dmitry E. Oboukhov unera на debian.org
Чт Ноя 6 06:41:47 PST 2008


я кажись догнал про километры
то есть чуток поправить:

Tmppo> sub split_one($$$)
Tmppo> {
Tmppo> my ($num, $what, $by)=@_;

$by/=1000;
Tmppo> $num=~s/,/./;

Tmppo> my $ret = '';
Tmppo> while($num>1)
while($num>$by)
Tmppo> {
Tmppo> $ret .= "$by $what\n";

Tmppo> $num -= 1;
Tmppo> }
Tmppo> $ret .= sprintf "%s %s\n", $by*$num, $what;
$ret .= sprintf "%s %s\n", $by*$num, $what;


вот полный пример:


#!/usr/bin/perl

use warnings;
use strict;
use utf8;
use open qw(:std :utf8);

my $string=<<endstr;
0,5(бухты по 50 м), 0,6(катушки по 300 м), 2,4(катушки
по 300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4(
катушки по 300 м), 2,4(катушки по 300 м), 2,4(катушки по
300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4
(катушки по 300м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,5(катушки по 500 м),
3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по
500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м),
3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по
500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м),
3(катушки по 300 м), 3,6(бухты по 100 м), 3,6(катушки по 300 м), 4,3(бухты
по 100 м), 4,4(бухты по 50 м), 4,4(бухты по 50 м)
endstr

sub split_one($$$)
{
    my ($num, $what, $by)=@_;

    $num=~s/,/./;

    my $ret = '';
    while($num>$by)
    {    
        $ret .= "$by $what\n";
        $num -= $by;
    }

    $ret .= sprintf "%1.3f %s\n", $num, $what;
    return $ret;
}

$string =~ s{(\d+(?:,\d+)?)\s*\(\s*(\S+)\s+(?:по\s+)?(\d+).*?\)\s*,?\s*}
    { split_one($1, $2, $3/1000) }esg;

print $string;

результат:

0.05 бухты
0.05 бухты
0.05 бухты
0.05 бухты
0.05 бухты
0.05 бухты
0.05 бухты
0.05 бухты
0.05 бухты
0.05 бухты
0.000 бухты
...

сразу видно что нельзя в плавающей арихметике считать бухгалтерию и количества

надо перевести все в метры а не километры

вот в метрах:


#!/usr/bin/perl

use warnings;
use strict;
use utf8;
use open qw(:std :utf8);

my $string=<<endstr;
0,5(бухты по 50 м), 0,6(катушки по 300 м), 2,4(катушки
по 300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4(
катушки по 300 м), 2,4(катушки по 300 м), 2,4(катушки по
300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4
(катушки по 300м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,4(катушки по 300 м),
2,4(катушки по 300 м), 2,4(катушки по 300 м), 2,5(катушки по 500 м),
3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по
500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м),
3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по
500 м), 3(катушки по 500 м), 3(катушки по 500 м), 3(катушки по 500 м),
3(катушки по 300 м), 3,6(бухты по 100 м), 3,6(катушки по 300 м), 4,3(бухты
по 100 м), 4,4(бухты по 50 м), 4,4(бухты по 50 м), 0,65(катушки по 300 м)
endstr

sub split_one($$$)
{
    my ($num, $what, $by)=@_;

    $num =~ s/,/./;
    $num *= 1000;

    my $ret = '';
    while($num>$by)
    {    
        $ret .= "$by $what\n";
        $num -= $by;
    }

    $ret .= sprintf "%d %s\n", $num, $what;
    return $ret;
}

$string =~ s{(\d+(?:,\d+)?)\s*\(\s*(\S+)\s+(?:по\s+)?(\d+).*?\)\s*,?\s*}
    { split_one($1, $2, $3) }esg;

print $string;

результат:


50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
500 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
300 катушки
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
100 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
50 бухты
300 катушки
300 катушки
50 катушки
--
... mpd playing: Крематорий - Шпалер

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera на debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537
----------- следущая часть -----------
A non-text attachment was scrubbed...
Name: отсутствует
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20081106/293fe84c/attachment-0001.bin>


Подробная информация о списке рассылки Moscow-pm