Что означает первый элемент dummy_argv для perl_parse?

Цитата из здесь:

static PerlInterpreter *my_perl;

main (int argc, char **argv, char **env)
{
   STRLEN n_a;
   char *dummy_argv[] = { "", "-e", "0" };

   my_perl = perl_alloc();
   perl_construct( my_perl );

   perl_parse(my_perl, NULL, 3, dummy_argv, NULL);
   perl_run(my_perl);

   /** Treat $a as an integer **/
   eval_pv("$a = 3; $a **= 2", TRUE);
   printf("a = %d\n", SvIV(get_sv("a", FALSE)));

   /** Treat $a as a float **/
   eval_pv("$a = 3.14; $a **= 2", TRUE);
   printf("a = %f\n", SvNV(get_sv("a", FALSE)));

   /** Treat $a as a string **/
   eval_pv("$a = 'relreP kcaH rehtonA tsuJ'; $a = reverse($a);", TRUE);
   printf("a = %s\n", SvPV(get_sv("a", FALSE), n_a));

   perl_destruct(my_perl);
   perl_free(my_perl);

Что означает первый элемент dummy_argv (здесь "") для perl_parse?

Я пытался изменить его на то, что я хочу, и ничего не меняется.


person new_perl    schedule 14.09.2011    source источник
comment
Вы не должны ссылаться на пиратские копии книг О'Рейли. .ua один пиратский.   -  person DVK    schedule 14.09.2011


Ответы (1)


В C argv[0] — это имя выполняемой программы. В большинстве случаев встроенному интерпретатору Perl все равно, что вы туда помещаете, поэтому вы ничего не заметите, когда его измените.

Помните, что Perl — это прежде всего автономный интерпретатор; встраивание его в другие программы является вторичным использованием. Функция Perl main() просто передает те же argc и argv, которые она получила, в perl_parse, потому что это самое простое. Когда вы вызываете perl_parse в своей программе, вы должны предоставить что-то для argv[0], но я думаю, что единственное, для чего он используется, это установка $^X, который не используется в большей части кода Perl.

person cjm    schedule 14.09.2011
comment
Это мой реальный вопрос: почему perl_parse требуется этот первый элемент, если он никогда не используется? - person new_perl; 14.09.2011
comment
Кажется неправильным, я только что попытался получить его gv = gv_fetchpv("^X", 0, SVt_PV);, но получил только нулевой указатель. - person new_perl; 15.09.2011
comment
@new_perl, попробуйте получить "\030" (фактический Ctrl-X) вместо "^X". Вы работаете ниже уровня, который преобразует имена специальных переменных. - person cjm; 15.09.2011
comment
Я только что попробовал, предположение неверно, $^X возвращает имя двоичного файла независимо от того, какой первый элемент dummy_argv. - person new_perl; 15.09.2011
comment
@new_perl, argv[0] — это только один из возможных источников $^X. Фактический механизм, с помощью которого Perl определяет значение, зависит от платформы; см. S_set_caret_X в perl.c. Я предполагаю, что ваша платформа использует один из других методов. Однако perl_parse API одинаков на всех платформах, поэтому вам все равно нужно указать какое-то значение, даже если ваша платформа его не использует. - person cjm; 15.09.2011