Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Вырезать куски текста


Автор: Error202 6.7.2010, 09:57
Господа!

Есть текстовый файл вида:

Код

:Test1
text text text text text text
text text text text text text
text text text text text text
end

:Test2
text2 text2 text2 text2 text2 text2
text2 text2 text2 text2 text2 text2
text2 text2 text2 text2 text2 text2
end

:Test3
text3 text3 text3 text3 text3 text3
text3 text3 text3 text3 text3 text3
text3 text3 text3 text3 text3 text3
end

:Test4
text4 text4 text4 text4 text4 text4
text4 text4 text4 text4 text4 text4
text4 text4 text4 text4 text4 text4
end


Как можно из этого всего сделать хэш вида:
$hash{Test1}='test test test...';
$hash{Test2}='test2 test2 test2...';
$hash{Test3}='test3 test3 test3...';
$hash{Test4}='test4 test4 test4...';

Спасибо!


Автор: Jimy 6.7.2010, 10:18
Читай файл построчно. Когда встречается строка начинающаяся с ":" определяешь ключ хэша по остатку строки (без двоеточия) и все остальные строки помещаешь в значение пока не встретится "end".
А извратится через регулярное выражения я не знаю как - я бы не заморачивался

Автор: Jimy 6.7.2010, 11:02
максимум что придумалось с использованием регулярки (при условии что двоеточие не встречается в тексте теста)

Код

$text_from_file =~ s/\n/\r/g;
my @tests = split(':', $text_from_file);
my %hash;
foreach (@tests) {
    $_ =~ m/(.*?)\r(.*?)end\r$/;
    $hash{$1} = $2;
    $hash{$1} =~ s/\r/\n/g;
}


Автор: Error202 6.7.2010, 11:03
Спасибо... все попробую

Автор: ming 6.7.2010, 12:53
Код

my $text = .... ; # получаем содержимое из файла
my %hash = ();

while($text =~ /:(.+?)\n(.+?)\nend/gs) {
    $hash{$1} = $2;
}

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

Автор: 7528620xs 19.8.2010, 12:01
А извратится через регулярное выражения я не знаю как - я бы не заморачивался




http://www.uggboots-esales.com/ugg-classic-tall-boots.html/http://www.uggboots-esales.com/ugg-sundance-ii-boots.html/http://www.uggboots-esales.com/ugg-sundance-ii-boots.html

Автор: KSURi 19.8.2010, 14:50
Говоря об извращениях ;)
Код

my %hash;
while(<DATA>) {
    chomp;
    if(/^:(Test\d+)$/ .. /^end$/) {
        next unless $1;
        if(exists $hash{$1}) { $hash{$1} .= $_ } 
        else                 { $hash{$1} = '' } # skip first entry 
    }
}

Автор: dva300 23.8.2010, 13:02
Цитата

Говоря об извращениях ;)


ну нормально smile 
как-то видел примерно следующую конструкцию для генератора случайных чисел от 0..9
креатиФ smile  и бросте в меня камнем если это чудо не работает  smile  

Код

if (!fork ())
    {
    $_ = $$;
    while(/^[-]?\d{2,}$/)
        {
        my $l = 0;
        map {$l += $_} /\d{1}/g;
        $_ = $l;
        }
    print;
    }


и вуаля   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)