Почему я получаю эту синтаксическую ошибку в моей программе генерации кода? - PullRequest
0 голосов
/ 03 августа 2010

Я хочу сгенерировать несколько строк кода Perl, используя обработку файлов в Perl, например:

open(FILEHANDLE, ">ex.pl") or die "cannot open file for reading: $!";
print FILEHANDLE "use LWP::UserAgent;"
....
.... some code is here 
....
print FILEHANDLE "my \$ua = new LWP::UserAgent(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5');"

Но когда я компилирую код генератора (не сгенерированный), я получаю эту ошибку:

syntax error at F:\test\sys.pl line 14, near "print"
Execution of F:\test\sys.pl aborted due to compilation errors.

Что я собираюсь делать?

Ответы [ 3 ]

2 голосов
/ 03 августа 2010

Вы пропустили закрывающий ' " ' (двойная кавычка) в конце строки последней печати (перед точкой с запятой).

Должно быть:

print FILEHANDLE "my \$ua = new LWP::UserAgent(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5')";

... Firefox/1.5.0.5')"; # To show end of that line without scrolling

Также пара небольших заметок:

  • Пожалуйста, рассмотрите возможность использования формы с тремя аргументами из open(), а не с двумя аргументами; а также лексические файловые дескрипторы:

    открыть (my $ fh, '>', "out.txt") или умереть "Ошибка открытия для записи: $!"; выведите $ fh "stuff \ n";

  • У вас нет close() дескриптора файла в конце - я полагаю, только потому, что вы дали неполный код.

1 голос
/ 03 августа 2010

Вам не хватает точки с запятой в конце этой строки:

print FILEHANDLE "use LWP::UserAgent;"
0 голосов
/ 03 августа 2010

Вот как вы пишете это на современном Perl:

use autodie qw(:all);
{
    open my $handle, '>', 'ex.pl';
    print {$handle} <<'PERL_SOURCE';
use LWP::UserAgent;
…
#  ↓ no variable quoting necessary thanks to here-document
my $ua = LWP::UserAgent->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5');
…
PERL_SOURCE
}

Как намекал Ether в комментариях вверху, почти никогда не нужно записывать динамически сгенерированный код в файл.eval и Moose::Meta::* существуют по причине.

...