Что-то вроде exec () для возврата значения в Perl? - PullRequest
0 голосов
/ 24 октября 2011

У меня сложилось впечатление (возможно, ошибочно), что функция 'exec' в Perl не возвращает значение (у меня сложилось впечатление, что она просто запускает команду). Ситуация такова, что Perl-скрипт работает на сервере, и мне нужно вызвать этот скрипт для запуска команд внутри Linux, но также возвращает результатов. Как это можно сделать?

Ответы [ 6 ]

7 голосов
/ 24 октября 2011

Если под «возвратить результаты» вы подразумеваете возврат STDOUT команд, вам нужны обратные метки или qx().Например:

my $result = qx(echo foo);
# or
my $result2 = `echo foo`;

Обратите внимание, что сообщения в STDERR не возвращаются.

Если вы имеете в виду статус выхода из программы, используйте system:

my $status = system("echo foo");
# or
my $status2 = system("/bin/echo", "foo", "bar");
3 голосов
/ 24 октября 2011

Мало того, что exec () не возвращает значение, оно не возвращает вообще .

perldoc -f exec

Функция exec выполняет системную команду и никогда не возвращается используйте system вместо exec, если хотите, чтобы он вернулся.

Но я почти уверен, что вам НЕ нужно возвращаемое значение system (), вы, похоже, хотите вывод команды, поэтому:

perldoc -f system

Это не то, что вы хотите использовать для захвата вывод команды, для этого вы должны использовать только обратные ссылки или qx //, как описано в perlop / "STRING".

2 голосов
/ 24 октября 2011

Из документации: http://perldoc.perl.org/functions/system.html

Я обычно использую это:

if(system(@args) != 0)
{
if ($? == -1) {
        print "failed to execute: $!\n";
    }
    elsif ($? & 127) {
        printf "child died with signal %d, %s coredump\n",
            ($? & 127),  ($? & 128) ? 'with' : 'without';
    }
    else {
        printf "child exited with value %d\n", $? >> 8;
    }
}
2 голосов
/ 24 октября 2011

Обычный способ запуска программы и сохранения результатов на Perl: backticks :

my $foo = `ls`;
1 голос
/ 24 октября 2011

STDOUT захвата:

my $dir = `pwd`;
my $dir = qx/pwd/;

Статус возврата захвата:

my $rc = system('pwd');

Perldocs Capture STDERR и STDOUT :

my $output = `cmd 2>&1`;

См. Ссылку для других способов захвата одного выходного потока, но не другого

0 голосов
/ 24 октября 2011

Использование back-tic

my $var = `shell command`;

в perl позволяет вам выполнять команды оболочки и возвращает любой вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...