【问题标题】:Make template a valid Perl file使模板成为有效的 Perl 文件
【发布时间】:2016-04-21 21:30:58
【问题描述】:

我编写了自己的 Perl 预处理器——当然是在 Perl 中。

我有一个包含有效 Perl 语法的模板文件,除了这样的语句

$VAR{ 'LABEL' } =
#include dir/PRECOMPILED.pl
;

其中PRECOMPILED.pl 包含使用 Data::Dumper 生成的匿名哈希,例如

{
    'a' => 1,
    'b' => 2,
}

当我预处理模板时,它会将PRECOMPILED.pl 包含到模板中并生成一个具有有效 Perl 语法的新文件。

有没有一种好方法可以让上面的模板行也成为有效的 Perl 程序语句,这样如果预处理器没有运行,我可以稍后在程序中检查 $VAR{ 'LABEL' } 是否有内容?

例如

if( $VAR{ 'LABEL' } ){
    # do something
}

【问题讨论】:

  • “有没有一种好方法可以使上面的模板行也成为有效的 perl 程序语句,这样如果预处理器没有运行......”$VAR{'LABEL'} = ; 不是有效的 Perl 语句,所以你如果你不运行你的预处理器,总是会出现语法错误。一般来说,首先生成 Perl 代码并不是一个好主意。你为什么要这样做?
  • 速度。预编译部分是转换成 perl 数据结构的大型 yaml 文件。yaml 文件包含由 perl 程序解释的语句,因此有两个级别的代码生成。其他开发人员只需编辑 yaml 文件,脚本就会自动将所有内容组合在一起。
  • 您指的是 perl 的-P 命令行选项,它允许您将 Perl 源代码作为第一次通过 C 预处理器? perl5120delta“Perl 的命令行开关“-P”,在 5.10.0 版本中被弃用,现在已被删除。”,所以它是一个不受支持的功能九年前已弃用,六年前已删除。你应该找到更好的方法。我建议您的数据应该即时解码您的 YAML 文件,或者创建一个适当的 Perl 模块
  • 我编写了自己的 perl 预处理器。当然,在 perl 中。如果我使用即时方法,程序需要 3-4 更长的时间。
  • @user2585500:我猜它们是相当大的 YAML 文件。您是否尝试过YAML::XS,它可能会更快?我建议您按照我所说的将 YAML 预处理为 Perl 模块,并且只需 use 它们而不是涉及您的预处理器。它开始听起来像一个永久数据库是有序的,这对启动时间只有很小的影响,根本没有导入

标签: perl preprocessor


【解决方案1】:

您可以使用do 声明:

$VAR{LABEL} = do {
#include dir/PRECOMPILED.pl
};

但是这个解决方案有副作用(如果重要的话):do 创建一个新范围。

【讨论】:

    【解决方案2】:

    我发现:

    $VAR{ 'LABEL' } = (
    #include dir/PRECOMPILED.pl
    )[0];
    

    也可以。

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2023-04-10
      • 1970-01-01
      • 2019-01-11
      • 2019-09-01
      相关资源
      最近更新 更多