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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Извлечение строк из определенного интервала 
:(
    Опции темы
shtuceron
Дата 9.10.2011, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте, на сайте Извлечение строк из определенного интервала есть интересная конструкция

Код

while (<>) {
  if (/НАЧАЛЬНЫЙ ШАБЛОН/../КОНЕЧНЫЙ ШАБЛОН/) {
  # Строка находится между начальным
  # и конечным шаблонами включительно.
  }
}

while (<>) {
  if ($НОМЕР_НАЧАЛЬНОЙ_СТРОКИ .. $НОМЕР_КОНЕЧНОЙ_СТРОКИ) {
  # Строка находится между начальной
  # и конечной включительно.
  }
}


Как можно получить саму строку чтобы продолжить работать с ней?

Спасибо!
PM MAIL WWW   Вверх
Pfailed
Дата 9.10.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(shtuceron @  9.10.2011,  12:29 Найти цитируемый пост)
Как можно получить саму строку чтобы продолжить работать с ней?

Начальную, конечную или какую?


--------------------
PM MAIL   Вверх
shtuceron
Дата 9.10.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



которая находится между /НАЧАЛЬНЫЙ ШАБЛОН/../КОНЕЧНЫЙ ШАБЛОН/
PM MAIL WWW   Вверх
Pfailed
Дата 9.10.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну первое что приходит в голову
Код

while (<>) {
  if (/НАЧАЛЬНЫЙ ШАБЛОН/../КОНЕЧНЫЙ ШАБЛОН/) {
    unless (/НАЧАЛЬНЫЙ ШАБЛОН/ || /КОНЕЧНЫЙ ШАБЛОН/) {
      # Строка находится между начальным
      # и конечным шаблонами не включительно.
    }  
  }
}




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


Бывалый
*


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

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



Правильно ли я понимаю что при чтении файла конструкция вида
Код

while (<>)
{
}


будет построчно перебирать строки в файле, а если это xml файл и закрывающий тег находится на другой строке это выражение не сработает, как в таком случае анализировать весь файл чтобы применить эту конструкцию или есть еще какие нибудь варианты поиска совпадения во всем файле???
PM MAIL WWW   Вверх
Pfailed
Дата 9.10.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сработает, вы почитайте по вашей же ссылке из первого поста.


--------------------
PM MAIL   Вверх
shtuceron
Дата 9.10.2011, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо

но пока не все получается)

я взяз для примера xml файл:
Код

<?xml version='1.0'?>
<opt id="one">
  <name>tom</name>
  <name>bob</name>
  <name>harry</name>
</opt>


и пытаюсь его обработать:
Код

while(<>)
{
  if (/<name>/../<\/name>/) {
    unless (/<name>/ || /<\/name>/) {
      print $_;
    }  
  }
}


на выходе я ничего не получаю:
совсем не то что я жду, как же достучаться до имен???

Это сообщение отредактировал(а) shtuceron - 9.10.2011, 16:27
PM MAIL WWW   Вверх
Pfailed
Дата 9.10.2011, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это потому что начальный шаблон и конечный и то что между ними на одной строке.
Эта конструкция сработает для случаев когда строка между шаблонами не будет содержаться в строке с начальным или конечным шаблоном. Например:
Код

<name>
tom
</name>



Цитата(shtuceron @  9.10.2011,  16:25 Найти цитируемый пост)
как же достучаться до имен???

Я надеюсь вы знаете про существование XML парсеров?

С оператором диапазона можно сделать что-нибудь такое
Код

while (<>) {
    if (/<name>/../<\/name>/) {
        if (/<name>(.+?)<\/name>/ || /<name>(.+)/ || /(.+?)<\/name>/) {
            print $1, "\n";
        }
        elsif (!/<name>/ && !/<\/name>/) {
            print;
        }
    }
}

Но это уже слишком громоздко. Советую поискать альтернативные пути, если это XML, то средств достаточно.



--------------------
PM MAIL   Вверх
shtuceron
Дата 9.10.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Я надеюсь вы знаете про существование XML парсеров?


Знаком, но не знаком ни с одним который бы мог вносить исправления по выбранным мною узлам (добавление/удаление/исправление атрибута или текстовому блоку) и сохранять исправления без обхода остальных узлов.

XML::Simple читает весь xml в хеш, но ходить по нему (если я не знаю структуры xml документа) у меня почему то не получается(

Пытаюсь делать так
Код

 foreach $key (keys %data)
 {
    print $key,"\n";
 }


ничего не происходит.
PM MAIL WWW   Вверх
alezzz
Дата 9.10.2011, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



если не ошибаюсь то XML::Simple возвращает не хеш а ссылку (reference ) на хеш, почитайте внимательнее документацию, там есть примеры с испольхованием Data::Dumper;
PM MAIL   Вверх
Pfailed
Дата 9.10.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(shtuceron @  9.10.2011,  17:41 Найти цитируемый пост)
Знаком, но не знаком ни с одним который бы мог вносить исправления по выбранным мною узлам

Посмотрите http://www.perlmonks.org/?node_id=712472
Помимо этого в документации XML::LibXML сказано
Цитата

XML::LibXML provides an light-wight interface to modify a node of the document



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


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

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


 




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


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

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