|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Dmitry Grebeniuk 2:469/105 01 Feb 2003 13:07:46 To : Oleg N. Kotenko Subject : [?] --------------------------------------------------------------------------------
OK> Ситуация: производится вывод (выводится некоторый текст) в STDOUT.
OK> Требуется изменить направление вывода (то, что выводится в STDOUT,
OK> должно стать значением некоторой переменной, а в STDOUT уже ничего
OK> попадать не должно) и после вернуть всё на место. Можно ли это сделать
OK> и если да, то как?
Вот мое решение. Довольно-таки уродливо, но мне нравится и у меня работает.
Если оптимизировать по скорости - то в сторону изничтожения постоянных
конкатенаций на каждый чих.
Частично передрано с man perlfunc и man perltie, поэтому я не уверен в
некоторых вещах - в методе tiehandle, например. И в нормальной работе всего
этого с форматами, потому как с ними почти не работал.
Ясен поц, что это будет работать только если нужно перенаправлять перлячьи
операции вывода. Если не только их, то можно поизвращаться с dup()-подобными
вызовами - open такое умеет (если, конечно, я правильно понимаю архитектуру
ввода/вывода перла).
=== Cut ===
#!/usr/bin/perl
package Sts;
sub TIEHANDLE
{
bless \$_[1], shift;
};
sub WRITE
{
$b = shift; my($buf, $len, $offset) = @_;
my $add_it = substr($buf, $offset, $len);
$$b = $$b . $add_it;
return length($add_it);
};
sub PRINT
{
$b = shift;
$$b = $$b . join($,,@_);
return 1;
};
sub PRINTF
{
$b = shift; my $fmt = shift;
$$b = $$b . sprintf($fmt, @_);
return 1;
};
package main;
my $buf = "";
{
tie(local *STDOUT, 'Sts', $buf);
print "а оно сохраняется...\n";
printf "и даже %s!\n", "так";
untie(*STDOUT);
};
print "что тут у нас сохранилось? а вот что:\n$buf", "---\n";
=== Cut ===
STDOUT восстанавливается по выходу из блока, где он "переопределен" local'ом.
bye
--- GoldED+/LNX 1.1.5
* Origin: gds/FH (2:469/105)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/18413e3ba3c7.html, оценка из 5, голосов 10
|