Forum Webscript.Ru
Программирование => Perl => Тема начата: Dinara от 08 Января 2002, 01:40:29
-
Проблема такая:
есть текстовый файл, весь размеченный таким образом:
bla-bla-bla
bla-bla-bla
И нужно выдирать из него то, что между определенными тегами. То есть именно несколько строк. Теги всегда простые, без параметров и вообще не html.
С надеждой, Динара.
-
Можно так:
#!/usr/bin/perl
my $text= qq~
bla-bla-bla
bla-bla-bla
bla-bla-bla
bla-bla-bla
bla-bla-bla
bla-bla-bla
~;
my %content;
my $tag;
while($text=~/(<(\\w+)>([\\w\\W]+)<\\/\\w+>)/){
$content{$2} .=$3;# .= на случай повторения
$tag=$1;
$text=~s/$tag//;
}
foreach my $key (keys %content){
print "$key:\\n $content{$key}";
}
А можно так (вариант2, на мой взгляд хуже первого):
#!/usr/bin/perl
my $text= qq~
bla-bla-bla
bla-bla-bla
bla-bla-bla
bla-bla-bla
bla-bla-bla
bla-bla-bla
~;
my @content=split(/<\\/[\\w\\d]+>/, $text);
my %content;
my $tag;
foreach my $elm(@content){
if ($elm=~/<([\\w\\d]+)>([\\w\\W]+)/){$content{$1}=$2;}
}
foreach my $key (keys %content){
print "$key:\\n $content{$key}\\n\\n";
}
Если хочешь как то иначе ;) скажи. Вообще, мне такой тип шаблона заинтересовал.
-
т.е.
нужно содержимое TAG1, оно тут: $content{\'TAG1\'},
TAG2: $content{\'TAG2\'}
;( правда если будут вложения то привет...
-
Ужас, я ничего не поняла.... глупая.
А можно как-нибудь использовать Range Operator? Ну то есть можно, конечно, но вот как? На мой взгляд, это специально для этого случая оператор.
оператор - .., две точки
-
#!/usr/bin/perl
my $text= qq~
bla-bla-bla
bla-bla-bla
~;
if ($text=~/<[\\w\\d]+>([\\w\\W]+)<\\/[\\w\\d]+>/){
$content=$1;
}
print $content;
А можно как-нибудь использовать Range Operator? Ну то есть можно, конечно, но вот как? На мой взгляд, это специально для этого случая оператор.
а можно примерчик, может тогда соображу к какому виду вы хотите все привести?
-
while (<>) {
if (/НАЧАЛЬНЫЙ ШАБЛОН/ .. /КОНЕЧНЫЙ ШАБЛОН/) {
# СТРОКА НАХОДИТСЯ МЕЖДУ НАЧАЛЬНЫМ
# И конечным шаблоном включительно
}
}
- так написано в Perl CookBook, и в документации по ActivePerl
вроде все понятно, но не представляю, как использовать
-
примерчик:
#!/usr/bin/perl
my $text= qq~
тут всякая чушь, ляляляляля
bla-bla-bla
bla-bla-bla
тут чушь продолжается
~;
#Создадим файлик
open (TXT, ">text.txt") or die ("Can\'t open? reason $!");
print TXT $text;
close TXT;
#А теперь считаем и выведем то что нужно:
open (TXT, "while(){
$content .=$_ if /<[\\w\\d]+>/ .. /<\\/[\\w\\d]+>/;
}
close TXT;
#Сейчас тут все что между тегами и сами теги
#Удалим их
$content=~s/<.*?>//g;
print $content;
-
Спасибо Вам большое за желание помочь!
Еще примечание: обрабатываемые тексты весьма аккуратны, быть там не может лишней чуши, все чинно и благородно.
Зачем это надо все: будет использоваться для движка сайта, этот файл - настроечный для каталога. Поэтому оттуда разными модулями программы должны будут выдираться только определенные теги.
-
Еще примечание: обрабатываемые тексты весьма аккуратны, быть там не может лишней чуши, все чинно и благородно.
это я так к слову, надо же было что-то написать ;)
Зачем это надо все: будет использоваться для движка сайта, этот файл - настроечный для каталога. Поэтому оттуда разными модулями программы должны будут выдираться только определенные теги.
хитро, ничего не скажешь..
правда мне кажется - не очень хорошо в смысле быстродействия, надо весь текст обрабатывать пока не найдется нужная запись.. может стоит все это хранить более упорядоченно, чтоб избегать излишних процедур обработки?
Спасибо Вам большое за желание помочь!
;) так мы достигли желаемого результата? Или еще нет?
-
Еще нет, :-((
Насчет хранения - да, согласна. Но сначала хотя бы так надо сделать.
А как Вы предлагаете?
-
Еще нет, :-((
а что еще нужно?
по идее, используя любой из вышеприведенных примеров можно выдрать содержимое _конкретного тега_
например:
#!/usr/bin/perl
my $content=&get_me_content(\'TAG1\');
sub get_me_content {
my $tag=shift;
undef $/;
open (TXT, "my $text=;
close TXT;
if ($text=~/<$tag>([\\w\\W]+)<\\/$tag>/){
return $1; #тут я маленько подправил
}
}
Таким образом можно даже выдернуть содержимое одновременно из нескольких тегов ;)
А как Вы предлагаете?
а смотря что там будет храниться: если опции для внутреннего использования (пути к папкам, урлы, использовать flock или нет), то имеет смысл завести файл my.cfg и подключать его в начале скриптов.
Если там будут шаблоны для генерации страниц, то можно воспользоваться чем-то вроде FastTemplate или сделать нечто аналогичное.
На худой конец, можно организовать это ка CSV базу, т.е. писать в спец. файл так:
опция|значение
опция|значение
и т.д.
-
Спасибо за этот пример! Думаю, это то, что надо!
Эх, я так боюсь регулярных выражений..... и программирования вообще. Чувствую себя такой маленькой в этом громенном мире больших и великих программистов....
А что такое FastTemplate?
У меня должно быть так:
в папке должен храниться конф файл для нее. Там будет название папки (раздела сайта), шаблон для нижележащих страниц и опции настройки меню.
Вся эта лабуда от того, что сайт-то один, а вот подсайтов на нем уже два, на одном из сайтов каждый раздел отличается от другого способом вывода меню (где-то важны названия страниц, где-то - голые даты).
-
А что такое FastTemplate?
перевод документации:
http://www.webscript.ru/stories.php3?story=01/04/30/0683549
легкий, маленький модуль-шаблонизатор.
в папке должен храниться конф файл для нее. Там будет название папки (раздела сайта), шаблон для нижележащих страниц и опции настройки меню
а может стоит сделать и общий конфиг (параллельно с локальными), например в нем были бы прописаны все пути, в том числе и к директории со всеми шаблонами, а в локальном - имя шаблона.
а то по каждой категории все раскидывать - потом долго собирать..
-
Ой, это слишком сложно так сразу. Мне проще пока так сделать.
Спасибо за помощь, я буду разбираться с этим завтра(сегодня). Посмотрите потом мой код на предмет совсем уж ламерских мест?
-
Посмотрите потом мой код на предмет совсем уж ламерских мест?
;) да я и сам то в общем-то (тихо, по секрету: л@мер)
Мне проще пока так сделать.
разумно - вначале как сможешь, а потом улучшаешь по воз-ти.
Насчет кода:
ключ -w
use strict;
;) и другие ламеры тебя такой не посчитают, да и код будет корректней с программной точки зрения.
я так боюсь регулярных выражений..... и программирования вообще. Чувствую себя такой маленькой в этом громенном мире больших и великих программистов....
тут ты не одинока, НЕпрограммистов тут тьма, например
Я
NAS, который тут главный
;) главное правильно притворяться - программеры, они ведь такие доверчивые:
if (true){print \'OK!\';}