2010-10-04 2 views
17
$ cat test.pl 
my $pid = 5892; 
my $not = system("top -H -p $pid -n 1 | grep myprocess | wc -l"); 
print "not = $not\n"; 
$ perl test.pl 
11 
not = 0 
$ 

Я хочу получить результат, то есть 11, в переменную. Как я могу это сделать?Как сохранить результат системной команды в переменной Perl?

+0

Также см [Что различия между системой и обратными кавычками и трубами в Perl?] (Http://stackoverflow.com/q/797127) – jww

ответ

40

От Perlfaq8:

Ты путаешь цель system() и backticks (``). system() запускает команду и возвращает информацию о статусе выхода (в качестве 16-битного значения: младшие 7 бит - это сигнал, с которого процесс умер, если таковой имеется, и высокие 8 бит являются фактическим значением выхода). Backticks (``) запускают команду и возвращают то, что она отправила в STDOUT.

$exit_status = system("mail-users"); 
    $output_string = `ls`; 

Существует множество способов выполнения внешних команд с Perl. Наиболее Обще с их значениями являются:

  • system(): вы хотите, чтобы выполнить команду и не хотите, чтобы захватить его выход
  • exec: вы не хотите, чтобы вернуться к вызова сценария Perl
  • backticks: вы хотите, чтобы захватить вывод команды
  • open: вы хотите трубы команду (как вход или выход) в скрипт

Также см How can I capture STDERR from an external command?

+0

спасибо @Nikhil. – Lazer

9

Самый простой способ - использовать функцию `` в Perl. Это выполнит то, что находится внутри, и вернет то, что было напечатано на стандартный вывод:

my $pid = 5892; 
my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`; 
print "not = $var\n"; 

Это должно быть сделано.

+0

ли $ PID замена в backtics новой функции? Не могу заставить его работать с 'v5.6.1'. – Lazer

+0

Это работало, насколько я помню. , например. try: 'perl -e '$ a =" Hello "; print \ 'echo $ a \' '' –

7

Попробуйте использовать qx{command}, а не обратные кавычки. Для меня это немного лучше, потому что: вы можете делать SQL с ним и не беспокоиться об экранировании кавычек и т. Д. В зависимости от редактора и экрана мои старые глаза, как правило, пропускают крошечные обратные тики, и у него никогда не должно быть проблем с перегрузкой, например, с помощью угловых скобок и glob.

+0

Отличный ответ! Решила мою проблему! – Alexey

2

Использование backtick или qx помогает, спасибо всем за ответы. Однако я обнаружил, что если вы используете backtick или qx, вывод содержит завершающую строку новой строки, и мне нужно удалить это. Поэтому я использовал chomp.

chomp($host = `hostname`); 
chomp($domain = `domainname`); 
$fqdn = $host.".".$domain; 

Более подробная информация здесь: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html

Смежные вопросы