Я пытаюсь заставить этот Perl код работать правильно, и я считаю, что мне просто нужно правильно указать свои ссылки. Я был бы признателен за любые отзывы о том, как использовать ссылки, но если этот код не может работать без изменений API, я также был бы признателен за отзывы о том, как изменить окружающие API-интерфейсы для поддержки необходимых мне типов данных.
Я пытаюсь добавить новый тест в набор тестов PostgreSQL. Рассматриваемый код запускает подпроцесс и сохраняет аргументы процесса в литерале массива в ha sh. например:
my %pgdump_runs = (
defaults => {
dump_cmd => [
'pg_dump', '--no-sync',
'-f', "$tempdir/defaults.sql",
'postgres',
],
},
# and others
)
Этот массив передается вспомогательной библиотеке следующим образом:
$node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} },
"$run: pg_dump runs");
Вспомогательная библиотека продолжает передавать массив вниз:
sub command_ok
{
my ($cmd, $test_name) = @_;
my $result = run_log($cmd);
а затем, наконец, вызов IP C :: Run :
sub run_log
{
return IPC::Run::run(@_);
}
Чтобы написать мой тестовый пример, у меня есть , чтобы передать вывод команды в файл дескриптор, не поддерживающий поиск. Похоже, что модуль IP C :: Run поддерживает трубопровод для вас. Вот пример для документации:
run \@cmd1, '|', \@cmd2;
Но я пробовал несколько разных способов структурировать литерал массива, и ни один из них не помог. Например, я пробовал это и считаю, что это дало мне ошибку ARRAY(0xFFFFFFFF)
:
dump_cmd => [
['pg_dump', 'db'],
'|',
['pg_restore', 'db2'],
],
Как я могу получить этот код для настройки нескольких подпроцессов с конвейером?
ОБНОВЛЕНИЕ : Я попробовал предложение ikegami: функция command_ok
может иметь только два аргумента, поэтому это не работает (вы должны передать ссылку на массив для первого аргумента).
UPDATE: поворот на IP C: Функция отладки Run Я вижу, как он пытается интерпретировать мою командную строку. Вместо того, чтобы разыменовать массив, он пытается преобразовать его в строку (?) И exe c эту строку как исполняемый файл:
1070 IPC::Run 0002 01234567890- [#11(59856)]: parsing [ 'ARRAY(0x7ff3016f1090)', '|', 'ARRAY(0x7ff3016f1510)', '>/Users/david/src/pg_bug/postgres/foo' ]