то есть нужно воспользоваться функцией open, только создавать не реальный файл, а т.н. файл в памяти - in memory file (не знаю как академически правильно перевести этот термин).
Только учти, что если ты хочешь перенаправлять STDOUT в файл в памяти, то тебе предварительно необходимо его -STDOUT - закрыть. То есть нужно сооружать примерно такую конструкцию:
close STDOUT;
open(STDOUT, '>', \$buffer);
Все. Теперь весь вывод в STDOUT будет у тебя помещен в переменную $buffer.
Наверное, в этом случае тебе нужно будет куда-нибудь редиректить STDERR, чтобы не путался под ногами (я просто не знаю, куда он в этом случае будет направлять свой вывод).
Как в перле они делаются я не знаю, но точно уверен, что они есть. Когда создается pipe - возвращаются два дескриптора. Все что пишется в один можно прочитать из другого.
Всем спасибо. Все работает :)16.07.05 18:49 Автор: Kerk Статус: Незарегистрированный пользователь
то есть нужно воспользоваться функцией 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, а потом, используя эту копию, восстановить 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, а в его середину, да еще и с заменой трех символов?
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
Моя ошибка. Я исходил из того, что main::STDOUT возвращается при вызове select без параметров. Проверил - заработало. Сейчас заглянул в корзину - в файле, где я это проверял, ошибся в close, написал "close SDTOUT" - вот оно и заработало. Ну, с кем не бывает.