информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медАтака на InternetСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / web building
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
HTTP Compression with Perl 15.07.05 19:50  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Задумал сделать сжатие страничек.
Чтоб меньше переделывать вижу такой алгоритм:

1. Перенаправляю stdout скрипта в какой-то буфер (например $buffer)
2. Тут сам скрипт / print "много всего"
3. Сжатие буфера $buffer
4. Отправка буфера пользователю.

Из всех пунктов вопросы вызывает только первый.
Как перенаправить вывод скрипта?
А перенаправить в поток? 18.07.05 11:36  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
А с другого конца потока прицепить компрессор
А можно подробнее? 18.07.05 12:04  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Каналы (pipes) те самые, которые в шелле делаютсяся символом "|" 18.07.05 14:43  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Как в перле они делаются я не знаю, но точно уверен, что они есть. Когда создается pipe - возвращаются два дескриптора. Все что пишется в один можно прочитать из другого.
Всем спасибо. Все работает :) 16.07.05 18:49  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
смотри в сторону "in memory files" 16.07.05 11:07  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
<"чистая" ссылка>
то есть нужно воспользоваться функцией open, только создавать не реальный файл, а т.н. файл в памяти - in memory file (не знаю как академически правильно перевести этот термин).
Только учти, что если ты хочешь перенаправлять STDOUT в файл в памяти, то тебе предварительно необходимо его -STDOUT - закрыть. То есть нужно сооружать примерно такую конструкцию:

close STDOUT;
open(STDOUT, '>', \$buffer);

Все. Теперь весь вывод в STDOUT будет у тебя помещен в переменную $buffer.
Наверное, в этом случае тебе нужно будет куда-нибудь редиректить STDERR, чтобы не путался под ногами (я просто не знаю, куда он в этом случае будет направлять свой вывод).

Не работает :( 16.07.05 12:50  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
my $buffer; close STDOUT; open(STDOUT, '>',\$buffer); print "qwerty"; open mFILE, '>123'; print mFILE $buffer; close mFILE;
после выполнения в файле 123 пусто
Еще как работает. 16.07.05 15:50  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
<"чистая" ссылка>
> > my $buffer; > close STDOUT; > open(STDOUT, '>',\$buffer); > print "qwerty"; > open mFILE, '>123'; > print mFILE $buffer; > close mFILE; >
> после выполнения в файле 123 пусто

Не может быть. Только что проверил как раз этот код - в файле 123 находится строка qwerty. Все как положено.
В IIS не работает. В апаче работает. Удивительно. Меня устраивает. :) 16.07.05 18:04  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
А как потом направить stdout обратно? чтоб я мог выдать свой буфер юзеру. 16.07.05 11:59  
Автор: Kerk Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Элементарно. 16.07.05 15:58  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
Отредактировано 16.07.05 16:06  Количество правок: 1
<"чистая" ссылка>
Идея состоит в том, чтобы создать как бы копию "старого" STDOUT, а потом, используя эту копию, восстановить STDOUT в прежнем виде.
В общем, твой код будет выглядеть вот так (я вставил комментарии - разберешься):
---
my $buffer;

open my $oldout, ">&STDOUT";    #создаем копию STDOUT

close STDOUT;
open(STDOUT, '>',\$buffer);
print "qwerty";

open STDOUT, ">&", $oldout;     #восстанавливаем STDOUT

{$buffer = "Buffer= ".$buffer;} #Здесь обрабатываем переменную $buffer

print STDOUT $buffer;           #Содержимое $buffer уйдет пользователю

---


Таким образом у тебя содержимое $buffer выведется в "нормальный" STDOUT, то есть уйдет пользователю следующее:

Buffer= qwerty

Возможо, есть и другие способы решения проблемы - я пользуюсь этим.
Совсем забыл предупредить. 16.07.05 23:37  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
<"чистая" ссылка>
Перед манипуляциями с $buffer (после вывода в него всего, что нужно) STDOUT нужно закрыть от греха подальше (либо сразу восстанавливать STDOUT в прежнем виде). Иначе могут возникнуть всякие неприятные моменты. В общем делать нужно примерно так:
my $buffer;

open my $oldout, ">&STDOUT";    #создаем копию STDOUT

close STDOUT;
open(STDOUT, '>',\$buffer);
print "qwerty";
close STDOUT

{$buffer = "Buffer= ".$buffer;} #Здесь обрабатываем переменную $buffer

open STDOUT, ">&", $oldout;     #восстанавливаем STDOUT
print STDOUT $buffer;           #Содержимое $buffer уйдет пользователю

---

Просто нежелатеьлно манипулировать с $buffer, пока он ассоциирован с STDOUT - могут возникнуть накладки, разобраться в которых без ста грамм нереально :)
Например, меня поставило в тупик следующее:
my $buffer;

open my $oldout, ">&STDOUT";    #создаем копию STDOUT

close STDOUT;
open(STDOUT, '>',\$buffer);
print "qwerty";

{$buffer = "Buffer= ".$buffer;} #Здесь обрабатываем переменную $buffer

print "aaa";

open STDOUT, ">&", $oldout;     #восстанавливаем STDOUT
print STDOUT $buffer;           #Содержимое $buffer уйдет пользователю

---


и получаем на выходе:

Bufferaaawerty

Кто-нибудь объяснит мне, отчего "aaa" залетело не в конец $buffer, а в его середину, да еще и с заменой трех символов?
Re: Кто-нибудь объяснит мне?.. 17.07.05 00:16  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
my $buffer;

open my $oldout, ">&STDOUT"; #создаем копию STDOUT

close STDOUT;
open(STDOUT, '>',\$buffer);
print "qwerty";

{$buffer = "Buffer= ".$buffer;} #Здесь обрабатываем переменную $buffer
Здесь ты приписываешь данные с концу переменной $buffer, но конкатенация не меняет текущей позиции в "файле". Можешь проверить это функцией tell STDOUT;

print "aaa";

open STDOUT, ">&", $oldout; #восстанавливаем STDOUT
print STDOUT $buffer;
Точно. Это же файл - вылетело из головы :) 17.07.05 01:01  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
<"чистая" ссылка>
Можно было сделать проще 16.07.05 22:33  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Использовать для вывода буфера пользователю дескриптор main::STDOUT - он никуда не девается. Тогда не пришлось бы заморачиваться с копией.
Как это - не девается? 16.07.05 23:27  
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
<"чистая" ссылка>
> Использовать для вывода буфера пользователю дескриптор
> main::STDOUT - он никуда не девается.

По-моему, в данном контексте STDOUT и main::STDOUT - одно и то же.
Как пример, исполни код:
my $buffer;

close STDOUT;
open(STDOUT, '>',\$buffer);
print "qwerty";

{$buffer = "Buffer= ".$buffer;}

print main::STDOUT $buffer;

---

Если ты прав, то скрипт должен вывести содержимое $buffer на экран.
Действительно.. 17.07.05 00:09  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Моя ошибка. Я исходил из того, что main::STDOUT возвращается при вызове select без параметров. Проверил - заработало. Сейчас заглянул в корзину - в файле, где я это проверял, ошибся в close, написал "close SDTOUT" - вот оно и заработало. Ну, с кем не бывает.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach