|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/52844e5b693f.html, оценка из 5, голосов 10
|