为什么一个常数中有两个@符号?

时间:2015-12-03 15:22:38

标签: perl constants autoconf

我正在阅读CIF(集体智慧框架)source code on GitHub

在文件src/lib/CIF/Generated.pm.in中,我看到了这样的声明

use constant PROTOCOL_VERSION   => @CIF_PROTOCOL_VERSION@;

为什么有两个符号 @

package CIF;

use warnings;
use strict;

use constant VERSION =>    '@CIF_VERSION_MAJOR@.@CIF_VERSION_MINOR@.@CIF_VERSION_PATCH@@CIF_VERSION_META@';
our ($MAJOR_VERSION, $MINOR_VERSION, $PATCH, $META) = VERSION =~ /^(\d+)\.(\d+)\.(\d+)-?([\w\.\d]+)?$/;

use constant PROTOCOL_VERSION   => @CIF_PROTOCOL_VERSION@;
use constant ORG                => '@ORG@';
use constant DEFAULT_PORT       => @DEFAULT_PORT@;

use constant DEFAULT_FRONTEND_PORT          => DEFAULT_PORT();
use constant DEFAULT_BACKEND_PORT           => (DEFAULT_PORT() + 1);
use constant DEFAULT_PUBLISHER_PORT         => (DEFAULT_PORT() + 2);
use constant DEFAULT_STATS_PUBLISHER_PORT   => (DEFAULT_PORT() + 3);

our $CIF_USER = '@CIF_USER@';
our $CIF_GROUP = '@CIF_GROUP@';

our $BasePath = '@CIF_PATH@';

our $LibPath    = '@siteperldir@';
our $EtcPath    = '@ext_sysconfdir@';
our $VarPath    = '@ext_localstatedir@';

our $LogPath    = $VarPath.'/log';
our $PidPath    = $VarPath.'/run';

our $BinPath    = $BasePath . '/bin';
our $SbinPath   = $BasePath . '/sbin';


our $SmrtRulesPath      = $EtcPath . '/rules';
our $SmrtRulesDefault   = $SmrtRulesPath . '/default';
our $SmrtRulesLocal     = $SmrtRulesPath . '/local';

1;

2 个答案:

答案 0 :(得分:9)

.pm.in不是Perl代码的常规扩展。相反,.in通常表示某种类型的模板,用于生成具有相同名称但删除了.in的文件。

在这种情况下,模板系统为Autoconf。如果您查看configure.ac,就会看到

AC_CONFIG_FILES([
    Makefile
    src/Makefile.PL
    src/lib/CIF/Generated.pm
    elasticsearch/Makefile
    hacking/packaging/ubuntu/default/cif
])

这意味着src/lib/CIF/Generated.pm会在src/lib/CIF/Generated.pm.in运行时生成configure@...@符号(Autoconf称之为“output variables”)将被当时配置的选项替换。它们不是Perl语法,它们是Autoconf的模板语法。

换句话说,Generated.pm.in不是Perl代码;它是一个模板,Autoconf可以从中生成Perl代码。像

这样的一行
use constant PROTOCOL_VERSION   => @CIF_PROTOCOL_VERSION@;

会变成

use constant PROTOCOL_VERSION   => 1;
如果src/lib/CIF/Generated.pm确定CIF_PROTOCOL_VERSION应为1,则configure中的

configure如何确定此处太复杂而无法解释;请阅读Autoconf manual了解详情。

答案 1 :(得分:2)

那些没有Perl的含义。带引号'的字符串没有可变插值,因此它们是文字@字符,而不是@CIF_USER或类似数组。

您提到的行实际上在Perl中存在语法错误。

use constant DEFAULT_PORT       => @DEFAULT_PORT@;

然而,其中一些引号和其他引用让我不相信这些实际上是模板代码,而且这个文件在被Perl运行之前将由某种模板引擎处理。在这种情况下,@DEFAULT_PORT@始终是一个数字,因此它不需要引号。同时,'@CIF_USER@'可能会生成一个用户名,该用户名可能包含非数字的内容,因此需要引用它们。

更新: This answer相关问题说明.in文件通常用作autoconf的输入。