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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Andrey Sapozhnikov                   2:5020/400     21 Dec 2001  21:36:06
 To : Anatoly Moskovsky
 Subject : Re: <DATA> + eval
 -------------------------------------------------------------------------------- 
 
 Anatoly Moskovsky wrote:
 
 > *** 21 декабря Igor S Chencov пишет Anatoly Moskovsky:
 >  AM>> eval <<EOF;
 >  AM>> print for (<DATA>);
 >  AM>> __END__
 >  AM>> 1
 >  AM>> 2
 >  AM>> 3
 >  AM>> 4
 >  AM>> EOF
 >  IS>
 >  IS> А так и не должно работать - DATA - идет в конце *файла* - а у тебя еще
 >  IS> и EOF.
 >  IS>
 > 
 > В том файле, откуда eval вызывается, нет возможности сформировать данные для
 > DATA, поскольку eval должен вызываться несколько раз с разными аргументами,
 > причем порядок вызовов заранее неизвестен.
 
 Я так понял, данные надо передавать в код виде дескриптора DATA, а 
 изначально мы имеем отдельно код и отдельно данные? Тогда делаем так:
 
 use IO::Scalar;
 
 my $code = "print for (<DATA>);\n";
 my $data = "1\n2\n3\n4\n";
 
 {
      local *DATA;
      tie *DATA, 'IO::Scalar', \$data;
      eval $code;
 }
 
 Строки с my разумеется заменить на настоящее формирование.
 Если какая-то собака уже сформировала переменную содержащую
 текст с __DATA__, мы его порежем:
 
 use IO::Scalar;
 
 my $text = <<EOF;
 print for (<DATA>);
 __END__
 1
 2
 3
 4
 EOF
 
 {
      local *DATA;
      my $data = $1 if $text =~ s/^__END__$\r?\n?(.*)//ms;
      tie *DATA, 'IO::Scalar', \$data;
      eval $text;
 }
 
 За исключением патологических случаев (например данный код
 и есть такой патологический. В нем встречается ^__END__$,
 но он не означает конец кода.) все будет работать.
 
 Андрей
 
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

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

 Тема:    Автор:    Дата:  
 <DATA> + eval   Anatoly Moskovsky   21 Dec 2001 02:19:43 
 Re: <DATA> + eval   Igor S Chencov   21 Dec 2001 11:09:05 
 Re: <DATA> + eval   Anatoly Moskovsky   21 Dec 2001 13:57:28 
 Re: <DATA> + eval   Andrey Sapozhnikov   21 Dec 2001 21:36:06 
 Re: <DATA> + eval   Anatoly Moskovsky   23 Dec 2001 15:36:33 
Архивное /ru.perl/52844e5b693f.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional