Forum Webscript.Ru
Программирование => Perl => Тема начата: AlexRH от 17 Марта 2004, 11:38:40
-
Здравствуйте!
Вопрос такой.
Можно ли при считывании файла по абзацам ( $/=""; ), создать хэш, где ключом была бы первая строка абзаца, а значением все остальное?
Если можно объсните,pls, как это делается.
-
AlexRH
Навскидку...
my $n = 10; # Количество символов в строке
$paragraf =~m /(.{$n,}).*/;
$hash{$1} = $paragraf;
Только не забудь проверить $1 на предмет запрещенных символов в ключе...
-
Спасибо.
Но, не сработало.
Phoinix:
my $n = 10; # Количество символов в строке
А, если я не знаю кол-во символов?
Phoinix:
$hash($1) = $paragraf;
Наверное $hash{$1} = $paragraf;
-
AlexRH
$hash{$1}
Да опечатался...
А, если я не знаю кол-во символов?
А кто знает?
Вообще понятие первой строки абзаца - довольно странное...
P.S. А что не сработало-то?
-
И что такое "абзац"?
-
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
Привет
Здесь второй
#######################
-
Вроде заработало.
Дело было в регулярном выражении. Ну
Вот, что я придумал:
s/\\A(.*)\\n//m; #заменить на ничто.
$hash{$1} = $_;
Ну, вот вроде и все.
-
AlexRH
while ( ) {
$paragraf =~m/(.{$n,}).*/;
$hash{$1} = $paragraf;
}
А где же ты $paragraf берешь? естественно будет ошибка, т.к. переменная не определена...
-
ААААААА я тормоз.
Большое спасибо.
Но, c другой стороны ты сам подсказал :-)
И ещё. Мне кажется для того, чтобы получить массив, нужно $paragraf разбиватть split\'ом.
{
local $/="";
while () {
my ($hkey, $value)=/(.*)\\n(.*)/sm;
push @{$hash{$hkey}}, split(/\\n/, $value);
}
}