当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么一个常数中有两个@符号?》经验,为你挑选了1个好方法。

我正在阅读GitHub上的CIF(Collective Intelligence Framework)源代码

在文件中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;

cjm.. 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.pmsrc/lib/CIF/Generated.pm.inconfigure运行时生成.的@...@(其Autoconf的称之为"符号输出变量 ")由在该时刻的配置的选项所取代.它们不是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如果configure确定CIF_PROTOCOL_VERSION应该是1.如何configure决定太复杂,在这里解释; 有关详细信息,请阅读Autoconf手册.



1> cjm..:

.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.pmsrc/lib/CIF/Generated.pm.inconfigure运行时生成.的@...@(其Autoconf的称之为"符号输出变量 ")由在该时刻的配置的选项所取代.它们不是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如果configure确定CIF_PROTOCOL_VERSION应该是1.如何configure决定太复杂,在这里解释; 有关详细信息,请阅读Autoconf手册.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有