Автор Тема: 2. Как txt файл разбить на абзатцы, и абз. записать в хеш?  (Прочитано 4547 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yuraz

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 111
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.kirov.ru/~yura
Замучал наверное своими вопросами, но не могу справится своими силами :(
Есть файл, с записями примерно такими: текст, потом пустая строка, т.е. разделитель, потом опять текст абзатцем.
Выглядит это так (3 записи):
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1Все сообщения о том, что якобы обнаружены члены съемочной группы Сергея Бодрова, не подтвердились. Об этом сообщили источники в оперативном шт

2Все сообщения о том, что якобы обнаружены члены съемочной группы Сергея Бодрова, не подтвердились. Об этом сообщили источники в оперативном

3Все сообщения о том, что якобы обнаружены члены съемочной группы Сергея Бодрова, не подтвердились. Об этом сообщили источники в операти
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Как пройти файл и разбить на части, чтобы получился массив записей, для последующего обращения к любой из них по индексу? (один абзац=одна запись).

Можно ли это сделать с помощью нескольких регулярных выражений, без цикла? Если использовать цикл поиска разделителей (\\n\\n) то как перебирать, по буквам? то наверняка это очень трудоемко получится, файл может быть под мегабайт, размером....

Ленивый гость

  • Гость
{#начало блока
open(local *DATA, "local $/;
$/="\\n\\n";
while(){
   $i++;
   $hash{$i}=$_;
}
}#конец блока


#Конструкция open(local *DATA, "#позваляет не закрывать файл clos\'ом
#он будет закрыт при выходе из блока

#$/="\\n\\n"; Позволяет разделить входные данные по "\\n\\n"

Ленивый гость

  • Гость
Да дескриптор DATA предопределён Не используйте его пока не прочтёте о нём

Ленивый гость

  • Гость
{
open(local *DATA, "local $/;
$/="\\n\\n";
while( ){
chomp;    #удолит из каждой строки "\\n\\n"
push @array, $_; #в массив так
}
}

Оффлайн Yuraz

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 111
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.kirov.ru/~yura
Ленивый гость, пробовал этим способом, что то он не перебирает, длина хеша -1, внизу выдает, и вторым способом тоже самое, -1.

open (local *DATA, "local $/;
$/="\\n\\n";
while( ){
$i++;
$hash{$i}=$_;
}
close (DATA);

print $#hash;   # = -1

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Цитировать
print $#hash; # = -1

А -1 будет в любом случае :)

например:

%h = (1=>2,3=>4);
print $#h,"\\n"; #-1
print keys %h; #1 3
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн YA

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 597
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Цитировать
$#hash
- это не "длина хэша", а индекс последнего элемента массива @hash.
Литературный перевод с русского и английского на Perl. Дорого!

Оффлайн Yuraz

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 111
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.kirov.ru/~yura
Может я перепутал с длиной массива? Тогда сори.

Оффлайн Yuraz

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 111
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.kirov.ru/~yura
Ленивый гость  спасибо, всё работает!

Оффлайн Yuraz

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 111
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.kirov.ru/~yura
А как определить длину хеша? Всю книгу С Холзнера "Перл, справочник" перелистал, найти не могу :(

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Например, по длине массива ключей :)

$hash_len = scalar keys %hash;
[ основной браузер когда-то был, теперь попробуй разберись =]

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28