Как использовать трубу в Perl

Мой синтаксис

my $pstree = `pstree -p $pid|wc`;

но я получаю ошибку.

sh: -c: line 1: syntax error near unexpected token `|'

Какие-нибудь мысли?

3 ответа

Ваша переменная $pid это не просто число; он, вероятно, имеет завершающий символ новой строки.

Посмотрите это с помощью:

use Data::Dumper;
print Data::Dumper->new([$pid])->Terse(1)->Useqq(1)->Dump;

Вместо того, чтобы использовать оболочку для подсчета, вы можете использовать Perl, который экономит вам процесс и усложняет вашу команду оболочки:

my $count = () = qx(pstree -p $pid);

qx() делает то же самое, что и спины Пустые скобки ставят qx() в контексте списка, что заставляет его возвращать список, который затем в скалярном контексте является размером. Это ярлык для:

my @list  = qx(pstree -p $pid);
my $count = @list;

Это действительно Perl, ваша оболочка - это то, на что вы жалуетесь. Вы поместили #!/ Bin/perl вверху скрипта? Вероятно, это интерпретируется bash, а не perl.

host:/var/tmp root# ./try.pl
5992  zsched
  6875  /usr/local/sbin/sshd -f /usr/local/etc/sshd_config
    3691  /usr/local/sbin/sshd -f /usr/local/etc/sshd_config -R
      3711  -tcsh
        6084  top 60
===
       5      16     175


host:/var/tmp root# cat try.pl 
#!/bin/perl

my $pstree = `ptree 3691`;
my $wc = `ptree 3691 | wc`;
print STDOUT $pstree;
print STDOUT "===\n";
print STDOUT $wc;
Другие вопросы по тегам