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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтр внутри фильтра 
:(
    Опции темы
amg
Дата 21.4.2007, 16:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Мой скрипт получает данные с stdin и пишет на stdout. Внутри скрипта вызывается внешняя программа-фильтр, которая тоже получает данные с stdin и пишет их на stdout. 
Помогите реализовать (без использования временных файлов). Что-то я совсем запутался с STDIN и STDOUT-ами.
PM MAIL   Вверх
Nab
Дата 21.4.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не понятен вопрос, нужно перехватывать вывод, или что?
Какое поведение реализовать не удаеться?


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 21.4.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Попробую по-подробнее, на примере с использованием временных файлов.
Нужно то же самое, но без использования временных файлов.
Код

# Программа-фильтр. Для примера, пусть это будет вычисление длины строки.
$filtr = qq(perl -lne "print length");

while (<STDIN>) {
  # Скрипт получает с stdin очередную строку. 

  # Модифицирует ее как-то

  # Пропускает модифицированную строку через фильтр
  open IN, '>file.in';
  print IN $_;
  close IN;
  system("cat file.in | $filtr > file.out");
  open OUT, 'file.out';
  $filtred = <OUT>;
  close OUT;

  # Модифицируется $filtred

  # результат выводится на stdout
  print "$filtred";
}

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


Опытный
**


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

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



amg, вот погляди вот здесь
http://forum.vingrad.ru/index.php?showtopi...st&p=950681
если вопросы еще остануться, пиши, а то я уже устал сегодня, спать пойду smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 23.4.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Пока вот что у меня получилось:
Код

use IPC::Open2;

$filtr = qq(perl -lne "print length");

while (<STDIN>) {
  open2(\*Reader, \*Writer, "$filtr" );
  
  print Writer "$_\n";
  close Writer;
  
  $filtred = <Reader>;
  close Reader;
  
  print "$filtred";
}

Не нравится. На каждую строку - новый процесс. В предыдущем варианте было на каждую строку - новый файл. Даже не знаю, что хуже.
PM MAIL   Вверх
Nab
Дата 23.4.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот так у меня получилось, все пашет норм, и отключение буферизации во внутреннем вызове ключевой момент smile
Код

use strict;
use warnings;

use IPC::Open2;

$|++;

my $filtr = q(perl -ne "$|=1; print length, $_");
my $filtred = '';

open2(\*Reader, \*Writer, $filtr );

while (<>) {

  print Writer "$_";

  $filtred = <Reader>;

  print "$filtred";
}
close Writer;
close Reader;

1;




--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 24.4.2007, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Nab, что-то у меня не работает твой код. Запускаю на linux script.pl file.txt. Ничего не печатает, ждет stdin. И еще, боюсь, с отключением буферизации во внутреннем вызове возможны проблемы - в качестве внутреннего фильтра ($filtr) будет программа, исходников которой у меня нет.
PM MAIL   Вверх
Nab
Дата 24.4.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ага, ну так там же кавычки первым делом другие, и вот я для линукса переписал:
Код

#!/usr/bin/perl

use strict;
use warnings;

use IPC::Open2;

$|++;

my $filtr = q(/usr/bin/perl -ne '$|=1; print length, $_');
my $filtred = '';
my ($wrh, $rdh);

open2($rdh, $wrh, $filtr);

while (<>) {

    print $wrh "$_";

    $filtred = <$rdh>;

    print $filtred;
}
close $wrh;
close $rdh;

1;


Добавлено через 1 минуту и 46 секунд
А на счет буферизации, то это в конкретном примере важно smile, оно и без нее пашет, но ждет долше smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 24.4.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да уж, про кавычки я и сам мог бы догадаться.
С правильными кавычками работает! Любопытно, что возвращаемая фильтром строка должна заканчиваться на "\n", иначе не работает.
А с буферизизацией буду пробовать, как оно себя поведет на реальном фильтре.

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


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

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


 




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


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

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