Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
Еще как работает. 16.07.05 15:50 Число просмотров: 3550
Автор: 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. Все как положено.
|
<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" - вот оно и заработало. Ну, с кем не бывает.
|
|
|