首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在一个常数中有两个“符号”?

为什么在一个常数中有两个“符号”?
EN

Stack Overflow用户
提问于 2015-12-03 15:22:38
回答 2查看 101关注 0票数 1

我正在阅读GitHub上的源代码 (集体情报框架)

src/lib/CIF/Generated.pm.in文件中,我看到了这样一条语句

代码语言:javascript
复制
use constant PROTOCOL_VERSION   => @CIF_PROTOCOL_VERSION@;

为什么有两个在路标@

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2015-12-03 15:32:45

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

在这种情况下,模板系统是欧康夫。如果你看看configure.ac,你会看到

代码语言:javascript
复制
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称之为"输出变量")在当时被配置的选项替换。它们不是Perl语法,而是Autoconf的模板语法。

换句话说,Generated.pm.in不是Perl代码;它是Autoconf可以生成Perl代码的模板。像这样的一行

代码语言:javascript
复制
use constant PROTOCOL_VERSION   => @CIF_PROTOCOL_VERSION@;

会变成

代码语言:javascript
复制
use constant PROTOCOL_VERSION   => 1;

src/lib/CIF/Generated.pm中,if configure确定CIF_PROTOCOL_VERSION应该是1。configure如何决定这一点太复杂,无法在这里解释;阅读Autoconf手册获取详细信息。

票数 9
EN

Stack Overflow用户

发布于 2015-12-03 15:28:59

这些都没有Perl的意义。带有单引号'的字符串没有变量内插,因此它们是文字@字符,而不是@CIF_USER或类似的数组。

在Perl中,您提到的行实际上有一个语法错误。

使用常数DEFAULT_PORT => @DEFAULT_PORT@;

然而,其中一些是引号,而另一些则没有让我相信这些实际上是模板代码,在Perl运行之前,这个文件将由某种类型的模板引擎处理。在这种情况下,@DEFAULT_PORT@总是一个数字,所以它不需要引号。同时,'@CIF_USER@'可能会产生用户名,其中可能包含非数字的内容,因此需要引用它们。

更新: 这个答案给出了一个相关问题,解释了.in文件通常用作的输入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34069694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档