2015-12-03 5 views
1

Я читаю СИФ (Collective Intelligence Framework) source code on GitHubПочему существуют два знака @ в одной константе?

В файле src/lib/CIF/Generated.pm.in я видел заявление, как этот

use constant PROTOCOL_VERSION => @[email protected]; 

Почему существуют два на знаки@?

package CIF; 

use warnings; 
use strict; 

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

use constant PROTOCOL_VERSION => @[email protected]; 
use constant ORG    => '@[email protected]'; 
use constant DEFAULT_PORT  => @[email protected]; 

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 = '@[email protected]'; 
our $CIF_GROUP = '@[email protected]'; 

our $BasePath = '@[email protected]'; 

our $LibPath = '@[email protected]'; 
our $EtcPath = '@[email protected]'; 
our $VarPath = '@[email protected]'; 

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; 
+0

источник: https://github.com/csirtgadgets/massive-octo-spice/blob/f01b0c676f653b30713dc0618324a69dd360c081/src/lib/CIF/Generated.pm.в –

+0

@MSU_Bulldog: Только потому, что вы достигли опыта, который позволяет редактировать вопросы, это не значит, что вы должны *. Ваши изменения ужасны: пожалуйста, уберите их, поскольку они препятствуют лучшему редактированию. – Borodin

ответ

2

Это не имеет значения Perl. Строки с одинарными кавычками ' не имеют переменной интерполяции, поэтому они являются буквальными @ символами, а не @CIF_USER или аналогичными массивами.

Вы упомянули, что на самом деле у вас есть синтаксическая ошибка в Perl.

use constant DEFAULT_PORT  => @[email protected]; 

Однако тот факт, что некоторые из них находятся в кавычках, а другие не приводят меня к мысли, что это на самом деле шаблон кода, и что этот файл будет обработан каким-то шаблонизатор перед тем как управлять Perl. В этом случае @[email protected] всегда будет числом, поэтому ему не нужны кавычки. В то же время '@[email protected]' может привести к имени пользователя, которое, вероятно, будет содержать вещи, которые не являются номерами, поэтому их нужно указывать.

Update:This answer на соответствующий вопрос объясняет, что .in файлы обычно используются в качестве входных данных для autoconf.

9

.pm.in не является нормальным расширением для кода Perl. Скорее, обычно указывает шаблон, который используется для создания файла с тем же именем, но с удаленным .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 работает. Символы @[email protected] (которые Autoconf называет «output variables») заменяются настроенными параметрами в это время. Они не являются синтаксисом Perl, они являются синтаксисом шаблона Autoconf.

Иными словами, Generated.pm.in не является кодом Perl; это шаблон, из которого Autoconf может генерировать Perl-код. Линия как

use constant PROTOCOL_VERSION => @[email protected]; 

станет

use constant PROTOCOL_VERSION => 1; 

в src/lib/CIF/Generated.pm если configure определяет, что CIF_PROTOCOL_VERSION должно быть 1. Как configure решает, что это слишком сложно, чтобы объяснить здесь; прочитайте Autoconf manual для деталей.

+0

Я искал этот файл, но не смог его найти. – simbabque

+0

Большое спасибо! – duye

+0

@duye, добро пожаловать. Если это ответит на ваш вопрос, вы можете указать, что, щелкнув галочку по счету. – cjm