【问题标题】:Why do I get this syntax error in my code generating program?为什么在我的代码生成程序中出现此语法错误?
【发布时间】:2011-03-24 10:33:07
【问题描述】:

我想通过在 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.

我要做什么?

【问题讨论】:

  • 第一行是矛盾的:你打开写,但错误信息说“读”,这是误导。
  • @Svante:复制和粘贴.. 宇宙中 54.8% 的错误的来源。
  • 你为什么要编写生成代码的代码?这是一件不寻常的事情,尤其是在基本脚本中。
  • 由于行长不容易看到:在问题中它是 Firefox/1.5.0.5');" ----在 DVK 的回答中是 Firefox/1.5.0.5')";

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


【解决方案1】:

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

应该是:

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

另外,还有几个小提示:

  • 请考虑使用3-argument formopen(),而不是2 参数;以及词法文件句柄:

    open(my $fh, '>', "out.txt") or die "Error opening for writing: $!"; 打印 $fh "stuff\n";

  • 您最后没有文件句柄的close() - 我假设只是因为您提供了不完整的代码。

【讨论】:

  • 是的,但是当我把 " 放在最后一次打印的末尾时,我再次收到此错误。我编辑它
  • @Jessica:你有没有把它放在':'之前,就像答案中的例子一样?
  • @Jessica - 没什么好遗憾的,我的措辞没有应有的清晰(这是实际的代码示例:)它现在工作了吗?
  • @Jessica - 大声笑......我将不得不传递来自 DVK 夫人身体伤害威胁的吻,但通过点击旁边的复选标记“接受”这个答案和/或通过点击旁边的向上箭头对其进行投票将不胜感激。
【解决方案2】:

您在这一行的末尾缺少一个分号:

print FILEHANDLE "use LWP::UserAgent;"

【讨论】:

  • 问题的原始版本有分号,但没有结束引号......现在的那个是更新的
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    相关资源
    最近更新 更多