Самый простой способ - использование обратных кавычек или qx()
:
my $value = qx(ls);
print $value;
Вывод аналогичен ls
.
См. ответ, который я только что отправил на этот вопрос. Вы можете использовать библиотеку callback (3)
для создания новых функций во время выполнения. Он не соответствует стандартам, поскольку включает в себя множество уродливых хаков, связанных с конкретной платформой, но он работает на большом количестве систем.
Библиотека заботится о выделении памяти, обеспечении ее исполняемости и очистке кеша инструкций. при необходимости, чтобы гарантировать, что код, который генерируется динамически (т. е. закрытие), является исполняемым. По сути, он генерирует заглушки кода, которые на x86 могут выглядеть так:
pop %ecx
push $THUNK
push %ecx
jmp $function
THUNK:
.long $parameter
, а затем возвращает адрес первой инструкции. Эта заглушка сохраняет адрес возврата в ECX (временный регистр в соглашении о вызовах x86), помещает дополнительный параметр в стек (указатель на преобразователь), а затем повторно отправляет адрес возврата. Затем происходит переход к самой функции. Это приводит к тому, что функцию вводят в заблуждение, заставляя думать, что у нее есть дополнительный параметр, который является скрытым контекстом закрытия.
На самом деле все сложнее (фактическая функция, вызываемая в конце заглушки, __ vacall_r
, а не саму функцию, и __ vacall_r ()
обрабатывает дополнительные детали реализации), но это основной принцип.
I don't believe you can do that with C99 -- there's no partial application or closure facility available unless you start manually generating machine code at runtime.
Apple's recently proposed blocks would work, though you need compiler support for that. Here's a brief overview of blocks. I have no idea when/if any vendor outside apple will support them.
Невозможно сгенерировать обычные функции во время выполнения ни на C, ни на C ++. Предложение Брайана основано на большом «если»: «... если вы можете подделывать анонимные функции ...». И ответ на это «если»: нет, нельзя. (Хотя неясно, что он имел в виду под «фальшивкой».)
(В C ++ можно создавать функционально-подобные объекты во время выполнения, но не обычные функции.)
Вышесказанное относится к стандартному C и Языки C ++. Конкретные реализации могут поддерживать различные предоставляемые реализацией расширения и / или реализованные вручную хаки, такие как «замыкания», «делегаты» и тому подобное. Ничего из этого, конечно, не имеет ничего общего со стандартными языками C / C ++.