Forum Webscript.Ru

Программирование => Perl => Тема начата: от 29 Мая 2002, 08:43:34

Название: Вопрос по Perl\'у
Отправлено: от 29 Мая 2002, 08:43:34
Есть пpога по обpаботке шаблонов и небольшой шаблон.

------------[ ....hello.html.... ]------------


HELLO







 
   
   
 






------------[ ···•••Конец Файла ]------------


------------[ ....hello.cgi.... ]------------
#!/usr/bin/perl
###############

sub function_hello(){
 print "Hello world !!!
\\n";
 }

sub template(){
 my ($page, $tag) = @_;
 local $/;
 open (DATA , "<$page");
 $page = ;
 close DATA;

 for($i=0;$i<=$#$tag; $i++){
  my $data = $tag->[$i][1];
  $page =~ s/<$tag->[$i][0]>/&$data/gsex;
  }
 return $page;
 }

print "Content-Type: text/html\\n\\n";

$page="hello.html";
$hello=\'hello\';
$string_hello="Hello world !!!
\\n";

my @params = ([$hello, \\&function_hello]);
print &template($page, \\@params);                                              
------------[ ···•••Конец Файла ]------------                                  
                                                                               
Вообщем сабж: Почемy если использовать ссылкy на фyнкцию &function_hello пpи  
выводе на экpан ввеpхy выводит сообщение "Hello world !!!", а в ячейках таблицы
выводит цифpy 1, хотя по идее должно выводить в ячейках таблицы? Если          
использовать ссылкy не на фyнкцию, а на стpокy $string_hello, тогда все        
ноpмально pаботает. Где тyт могyт быть гpабли?
Название: Вопрос по Perl\'у
Отправлено: Evgeny от 29 Мая 2002, 11:25:51
Опиши ф-цию function_hello() так:
sub function_hello()
{  return "Hello world !!!
\\n";
}

Если описать её так, как у тебя, то получается возвращает она 1 (результат последней выполненной операции).
Название: Вопрос по Perl\'у
Отправлено: от 30 Мая 2002, 09:40:33
А можно как-нибудь сделать это, не изменяя функцию. Т.е. чтоб в точке замены выводило не значение функции а результат ее работы?
Название: Вопрос по Perl\'у
Отправлено: Evgeny от 31 Мая 2002, 12:08:27
Цитировать
А можно как-нибудь сделать это, не изменяя функцию. Т.е. чтоб в точке замены выводило не значение функции а результат ее работы?

Результатом работы ф-ции в принципе и есть то, что она возвращает.
Никогда не приходилось таким заниматься, но есть небольшая идея. Перед выполнением ф-ции template перенаправить поток, который выводит ф-ция function_hello в STDOUT в какой-нибудь другой поток (можно оформить в какую-нибудь отдельную ф-цию), а потом считывать данные из нового потока и работать уже с ними. Затем восстановить выходной поток function_hello.