Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 [?]   Oleg N. Kotenko   30 Jan 2003 13:18:48 
 [?]   Dmitry Grebeniuk   01 Feb 2003 13:07:46 
Архивное /ru.perl/18413e3ba3c7.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional