为什么我的代码生成程序中出现此语法错误?

时间:2010-08-02 21:18:02

标签: perl dynamic code-generation compiler-errors perl-io

我想通过在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 个答案:

答案 0 :(得分:2)

您错过了最后一个打印字符串末尾(分号前)的结束' " '(双引号)。

应该是:

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()的{​​{3}},而不是2参数;以及词汇文件句柄:

    打开(我的$ fh,'>',“out.txt”)或死于“写入错误:$!”; 打印$ fh“stuff \ n”;

  • 你最后没有close()文件句柄 - 我假设你的代码不完整。

答案 1 :(得分:1)

你在这一行的末尾错过了一个分号:

print FILEHANDLE "use LWP::UserAgent;"

答案 2 :(得分:0)

这就是你在现代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在顶部的评论中暗示的那样,几乎没有必要将动态生成的代码写入文件中。 evalMoose::Meta::*存在是有原因的。