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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг фалйла, выделение/получение частей файла 
V
    Опции темы
Zubilo
Дата 22.5.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.11.2007
Где: Химки

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



Всем доброго времени суток!

Затупил в следующей ситуации:  

есть текстовый файл такой структуры:

Код

Поле1: здесь  многострочный текст, который заканчивается точкой с запятой;
...
ПолеN: многострочный текст, который заканчивается точкой с запятой;


надо получить все поля и соответствующее им содержание(многострочный текст) в соответствующие переменные.

поля получаю так:

Код

my @polya;
my $currString;

open(F,"<file.txt");

while($currString=<F>){
      if($currString=~/(.+):/g){
         push(@polya,$1);
      }
}

получить текс не получается т.к. файл считывается построчно.
Есть у кого-нибудь идеи как  можно получить многострочный текст из файла?




PM MAIL   Вверх
DaemonSuw
Дата 22.5.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно прочитать весь файл за одну операцию в скалярную  переменную, если присвоить значение  undef специальной переменной $/, в которой задается разделитель записей текстовых файлов. После прочтения файла в скаляр можно восстановить прежнее значение этой переменной  "\n", которую она имела по умолчанию.
Пример:

 open(F,"<file.txt");
 $/=undef;        
 $sfile = <F>;
 $/="\n" ;          

 $sfile =~ /регулярка/
PM MAIL ICQ   Вверх
KSURi
Дата 22.5.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

D:\>type t.txt
Pole1: some text here;
Pole2: multi
line text;
Pole3: some text again;

D:\>

Код

open(my $fh, 't.txt') || die $!;
my @data;
{ local $/ = undef; @data = <$fh> =~ /[\w\d]+:(.+?)/gs }
close $fh;


Это сообщение отредактировал(а) KSURi - 22.5.2008, 01:07


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
amg
Дата 22.5.2008, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Еще вариант, менее изящный, но не требующий зачитывать файл целиком в память
Код
open(my $fh, 't.txt') || die $!;
while (<$fh>) {
  if (/^Pole\d+:/ .. /;$/) {
    $pole .= $_;
    next;
  }
  $pole =~ /^(Pole\d+):\s*(.*);$/s;
  print "$1 => $2\n";
  $pole = '';
}
close $fh;


PM MAIL   Вверх
yura_nev
Дата 22.5.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код
local $/ = ";"; # Бедная эта переменная, почему над ней все только и знают что undef ??
open my $h, '<', 't.txt' or die $!;
my $data = { map { m/:/ ? ($` => $') : () } <$h> }; # Получаем хеш вида (ПолеN => Значение), если поля поля одинаковые, то возьмется последнее значение
close $h;

PM MAIL   Вверх
Zubilo
Дата 22.5.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.11.2007
Где: Химки

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



Странно, но первые два варианта у меня работают не правильно, в чем затык не пойму :(
последний вариант работает .
Всем огромное спасибо. 
Код

local $/ = ";"; # Бедная эта переменная, почему над ней все только и знают что undef ??
open my $h, '<', 't.txt' or die $!;
my $data = { map { m/:/ ? ($` => $') : () } <$h> }; # Получаем хеш вида (ПолеN => Значение), если поля поля одинаковые, то возьмется последнее значение
close $h;
my %hash=%$data;
print map{"$_=$hash{$_}"} keys(%hash);


 

Это сообщение отредактировал(а) Zubilo - 22.5.2008, 13:33
PM MAIL   Вверх
ginnie
Дата 22.5.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



yura_nev, может

Код

m/:/ ? ($` => $') : ()


заменить на 

Код

split(/:\s+/, $_, 1)



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Zubilo
Дата 22.5.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.11.2007
Где: Химки

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



Цитата(ginnie @ 22.5.2008,  13:27)
yura_nev, может

Код

m/:/ ? ($` => $') : ()


заменить на 

Код

split(/:\s+/, $_, 1)

получается что лучше менять на 
Код

split(/:\s+/, $_, 2)

PM MAIL   Вверх
nitr
Дата 22.5.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



 smile 
yura_nev, я не встречал случая где надо было именно undef или присвоить что-либо, всегда достаточно было объявить local.

Поправьте меня, вот чтиво perldoc perlsub Temporary Values via local() http://perldoc.perl.org/perlsub.html#Tempo...ues-via-local()


--------------------
PM   Вверх
ginnie
Дата 22.5.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Zubilo, Вы правы, я ошибся!  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
KSURi
Дата 22.5.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile 
Цитата

A local just gives temporary values to global (meaning package) variables. It does not create a local variable.

Поэтому с явным присваиванием undef'a просто немного логичнее выглядит имхо: ты временно присваиваешь глобальной переменной новое значение, которое по выходу из блока будет восстановлено обратно. Конструкция {local$/} тоже присвоит undef, только неявно. 

Если бы local создавал копию переменной для блока, тогда логичнее было бы делать так, как вы предложили.
Во всяком случае я так думаю)


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


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

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


 




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


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

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