Как я могу передать массив функции C в Perl XS?

Случайно не соединяйте шифрование с путаницей. Мы обычно запутываем электронные письма для предотвращения спама. Много веб-сайтов будет иметь "веб-мастера _at_ mysite.com" для замедления поисковых роботов от парсинга адреса электронной почты как потенциальная цель спама. Это должно быть сделано в шаблонах HTML - нет никакого значения к выполнению этого в персистентном устройстве хранения данных базы данных.

Мы ничего не шифруем, если мы не должны держать его в секрете во время передачи. Когда и где будет Ваши передаваемые данные?

  1. SQL-операторы передаются от клиента к серверу; это находится на том же поле или по безопасному соединению?

  2. , Если Ваш сервер поставился под угрозу, у Вас есть неумышленная передача. Если Вы волнуетесь по поводу этого, то необходимо, возможно, защищать сервер. У Вас есть внешние угрозы, а также внутренние угрозы. ВСЕ пользователи (внешние и внутренние) правильно аутентифицируемый и авторизованный?

  3. Во время резервных копий у Вас есть намеренная передача к резервным носителям; это сделано с помощью безопасной стратегии резервного копирования, которая шифрует, когда она идет?

10
задан brian d foy 1 October 2009 в 20:06
поделиться

2 ответа

XS может получать ссылку на ARRAY как AV * или SV * . Последний должен быть разыменован на AV * .

use Inline C => DATA;
@array = (1 .. 20);
$r = sum_of_elements1(\@array);
$s = sum_of_elements2(\@array);
print "$r $s\n";  #  produces output: "210 210\n"
__END__
__C__
double sum_of_elements1(AV* array)
{
  int i;
  double sum = 0.0;
  for (i=0; i<=av_len(array); i++) {
    SV** elem = av_fetch(array, i, 0);
    if (elem != NULL)
      sum += SvNV(*elem);
  }
  return sum;
}

double sum_of_elements2(SV* array_ref)
{
  AV* array;
  if (!SvROK(array_ref) || SvTYPE(SvRV(array_ref)) != SVt_PVAV)
    croak("expected ARRAY ref");
  array = (AV*) SvRV(array_ref);
  return sum_of_elements1(array);
}

Файл .xs, созданный этим кодом, объявляет:

double
sum_of_elements1 (array_ref)
        SV *    array_ref

double
sum_of_elements2 (array)
        AV *    array

Изменить: в sum_of_element2 () добавлена ​​проверка что * SV была ссылкой на массив.

11
ответ дан 3 December 2019 в 20:05
поделиться

Вы не можете передать массив Perl и автоматически преобразовать его, скажем, в массив целых чисел C. Для этого вам придется прибегнуть к XS и perlapi . Причина проста: массив perl содержит нетипизированные скаляры. Массив AC содержит N элементов одного типа.

Что вы можете сделать, так это создать XSUB , который принимает SV * . SV обозначает скалярное значение. Это, естественно, включает ссылки ( RV ) и, следовательно, также ссылки на массивы ( AV ).

Вот как вы можете проверить, соответствует ли данный SV * источник - это ссылка на массив:

SV* tmpSV;
AV* theArray;
if (SvROK(source)) {                /* it's a reference */
  tmpSV = (SV*)SvRV(source);        /* deref */
  if (SvTYPE(tmpSV) == SVt_PVAV) {  /* it's an array reference */
    theArray = (AV*)tmpSV;
    /* do stuff with the array here */
  }
}
8
ответ дан 3 December 2019 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: