perl shell命令变量错误

时间:2015-03-09 21:05:30

标签: linux perl shell

我正在尝试在我的一个perl脚本中跟踪代码并获得错误,如何执行以下shell命令并存储在变量中

#!/usr/bin/perl -w

my $p = $( PROCS=`echo /proc/[0-9]*|wc -w|tr -d ' '`; read L1 L2 L3 DUMMY < /proc/loadavg ; echo ${L1}:${L2}:${L3}:${PROCS} );
print $p;

错误:

./foo.pl
Bareword found where operator expected at /tmp/foo.pl line 3, near "$( PROCS"
        (Missing operator before PROCS?)
syntax error at /tmp/foo.pl line 3, near "$( PROCS"
Unterminated <> operator at /tmp/foo.pl line 3.

有什么问题?

2 个答案:

答案 0 :(得分:4)

此:

my $p = $( PROCS=`echo /proc/[0-9]*|wc -w|tr -d ' '`; read L1 L2 L3 DUMMY < /proc/loadavg ; echo ${L1}:${L2}:${L3}:${PROCS} );

不是perl。这是您在bash中执行命令的方式。

要在perl中运行命令,您可以:

但是,您要在那里枚举目录,wordcounting,tring和阅读。所以你实际上并不需要使用shell命令来完成所有这些操作。事实上,我不鼓励你这样做,因为这只是一种混乱而没有生产效益的方法。

看起来你最后的结果是3个负载平均样本和进程数量。是对的吗?

在哪种情况下:

my $proc_count = scalar ( () = glob ( "/proc/[0-9]*" ));
open ( my $la, "<", "/proc/loadavg" ) or warn $!; 
print join ( ":", split ( /\s+/, <$la> ), $proc_count ),"\n";

无论如何都是这样的。

答案 1 :(得分:3)

在Perl脚本中只需print一个shell命令就不会实际执行它。您必须告诉Perl它是一个外部命令,您可以使用system执行此操作:

use strict;
use warnings;

my $command = q{
    PROCS=`echo /proc/[0-9]*|wc -w|tr -d ' '`;
    read L1 L2 L3 DUMMY < /proc/loadavg;
    echo ${L1}:${L2}:${L3}:${PROCS}
};
system($command);

(请注意,您应将use strict; use warnings;放在您编写的每个 Perl脚本的顶部。)

但是,使用本机Perl功能而不是system通常会更好。你所做的只是从文件中读取,Perl完全有能力做到这一点:

use strict;
use warnings;
use 5.010;

my @procs = glob '/proc/[0-9]*';

my $file = '/proc/loadavg';
open my $fh, '<', $file or die "Failed to open '$file': $!";

my $load = <$fh>;

say(join ':', (split ' ', $load)[0..2], scalar @procs);

更好的方法可能是使用Proc::ProcessTable模块,它为不同风格的* nix提供了/proc文件系统的一致接口。它在早期得到了一些不好的评论,但现在应该得到错误修正;我自己还没有用过,但你可以看一下。