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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Точно. Это же файл - вылетело из головы :) 17.07.05 01:01  Число просмотров: 3423
Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
<"чистая" ссылка>
<web building>
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