Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение файла в переменную и мультистрочный поиск 
:(
    Опции темы
Suppir
Дата 28.2.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Необходимо прочитать 30-Мб файл в переменную и сделать в переменной мультистрочный поиск. Пишу:

Код

open($in, "$filepath");
while(<$in>){
    while (/^(!.+?)^\s*$/msg){print OUT "$1\n"}
}


Поиск в одной строке работает, а мультистрочный поиск - нет. Т.е. символ "." в сочетании с модификатором /s не дает совпадения с \n.



зы. хочу поймать такие строки:

!КОМАНДА
текст текст текст текст текст текст текст текст текст текст текст текст


Т.е. если строка начинается на "!", то нужно печатать все до тех пор, пока не будет полностью пустая строка (^\s*$).


Это сообщение отредактировал(а) Suppir - 28.2.2011, 14:57
PM MAIL   Вверх
arto
Дата 28.2.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perl -0777 -lne 'm#^(!.+?)\n\n#sm && print $1'
PM MAIL ICQ   Вверх
powerfox
Дата 28.2.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Код

open my $test_file, '<', 'qwe.txt' or die "Can't open file";
while (<$test_file>) {
    if (/^!\w/) {
        print $_;
        while ((my $cur_str = <$test_file>) !~ /^\s*$/) {
            print $cur_str;
        }   
    }
}



Цитата(Suppir @  28.2.2011,  15:54 Найти цитируемый пост)
Необходимо прочитать 30-Мб файл в переменную и сделать в переменной мультистрочный поиск. Пишу

Ваш код не соответствует описанию. Вы читаете построчно.


--------------------
user posted image
PM WWW   Вверх
arto
Дата 28.2.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perl -0000 -lne 'm#^(!.+)#sm && print $1' -- чтобы тратить меньше памяти
PM MAIL ICQ   Вверх
Suppir
Дата 28.2.2011, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



powerfox, 

нужен именно мультистрочный поиск, потому там много чего нужно искать, куча паттернов. 


arto, 

не могу понять, как ваш код записать в привычном виде (не в одну строку). Можно ли аналогичный пример (с мультистрочным поиском), но в привычном виде?
PM MAIL   Вверх
gcc
Дата 28.2.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



если нужна скорость, то не поробовать ли sysopen sysread sysseek ?
PM WWW ICQ Skype GTalk Jabber   Вверх
powerfox
Дата 28.2.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Цитата(Suppir @  28.2.2011,  17:40 Найти цитируемый пост)
нужен именно мультистрочный поиск, потому там много чего нужно искать, куча паттернов. 


Код

open my $test_file, '<', 'qwe.txt' or die "Can't open file";
my $content = join("", <$test_file>);

my @all_matches = $content =~ /^(!.+?)^\s*$/smg;


Это сообщение отредактировал(а) powerfox - 28.2.2011, 17:06


--------------------
user posted image
PM WWW   Вверх
Suppir
Дата 28.2.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



powerfox, 

Спасибо. Я пробовал склеивать строки аналогичным образом - получается очень медленно. Нужно много раз пропарсить 1 Гб текста (30 файлов по 30 Мб). Если есть более быстрый способ, чем склеивание строк, то буду благодарен.
PM MAIL   Вверх
powerfox
Дата 28.2.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Цитата(Suppir @  28.2.2011,  18:20 Найти цитируемый пост)
Если есть более быстрый способ, чем склеивание строк, то буду благодарен.

Цитата(Suppir @  28.2.2011,  18:20 Найти цитируемый пост)
Нужно много раз пропарсить

Проблема в этом. Возможно, можно парсить и не много раз, а 1-2.


--------------------
user posted image
PM WWW   Вверх
Suppir
Дата 28.2.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



powerfox, 

имею в виду при тестировании smile
PM MAIL   Вверх
arto
Дата 1.3.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



читайте сразу весь файл.
либо по логическим частям.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2051 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.