Автор Тема: Чтение по абзацам и хэш массивов, подскажите.  (Прочитано 3932 раз)

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

Оффлайн AlexRH

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Здравствуйте!
Вопрос такой.
Можно ли при считывании файла по абзацам ( $/=""; ), создать хэш, где ключом была бы первая строка абзаца, а значением все остальное?
Если можно объсните,pls, как это делается.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
AlexRH

Навскидку...

my $n = 10; # Количество символов в строке
$paragraf =~m /(.{$n,}).*/;
$hash{$1} = $paragraf;

Только не забудь проверить $1 на предмет запрещенных символов в ключе...
« Последнее редактирование: 17 Марта 2004, 12:45:36 от Phoinix »

Оффлайн AlexRH

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Спасибо.
Но, не сработало.

Цитировать
Phoinix:
my $n = 10; # Количество символов в строке

   А, если я не знаю кол-во символов?

Цитировать
Phoinix:
$hash($1) = $paragraf;

   Наверное $hash{$1} = $paragraf;

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
AlexRH
Цитировать
$hash{$1}

Да опечатался...

Цитировать
А, если я не знаю кол-во символов?

А кто знает?

Вообще понятие первой строки абзаца - довольно странное...

P.S. А что не сработало-то?
« Последнее редактирование: 17 Марта 2004, 13:10:35 от Phoinix »

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
И что такое "абзац"?
Все болезни от нервов, только сифилис от удовольствия

Оффлайн AlexRH

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
quote]Phoinix:
Вообще понятие первой строки абзаца - довольно странное...[/quote]
Ну, может быть.
Под "абзацем" в данном случае я подразумевал n-е кол-во строк, отделенное от другого "абзаца" пустой строкой.
И первая строка такого "абзаца" - это первая строка после пустой строки. (О, как! ;-)
Наверное, можно это назвать и записями, разделенными пустой строкой.

Цитировать
Phoinix:
P.S. А что не сработало-то?



Perl ругается:
Use uninitialied value in pattern match (m//).
Use uninitialied value in hash element.

Код такой.
####################
#!perl -w

use strict;

$/="";

my %hash;
my ($paragraf, $key);
my $n = 5;


open(FN, "fn.txt") || die "$!";

while () {
   $paragraf =~m/(.{$n,}).*/;
   $hash{$1} = $paragraf;
}
#######################

fn.txt
#######################
абзац1
Здесь находится первый
абзацццц

абзац2
Привет
Здесь второй

#######################

Оффлайн AlexRH

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Вроде заработало.

Дело было в регулярном выражении. Ну
Вот, что я придумал:

           s/\\A(.*)\\n//m; #заменить на ничто.
           $hash{$1} = $_;

Ну, вот вроде и все.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
AlexRH

Цитировать
while ( ) {
$paragraf =~m/(.{$n,}).*/;
$hash{$1} = $paragraf;
}


А где же ты $paragraf берешь? естественно будет ошибка, т.к. переменная не определена...

Оффлайн AlexRH

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 16
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
ААААААА я тормоз.
Большое спасибо.
Но, c другой стороны ты сам подсказал :-)

И ещё. Мне кажется для того, чтобы получить массив, нужно $paragraf разбиватть split\'ом.

{
local $/="";
  while () {

   my ($hkey, $value)=/(.*)\\n(.*)/sm;
   push @{$hash{$hkey}}, split(/\\n/, $value);
  }
}

 

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