我正在尝试在我的一个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.
有什么问题?
答案 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中运行命令,您可以:
system
。qx
(quote-execute):http://perldoc.perl.org/perlop.html#Quote-Like-Operators 但是,您要在那里枚举目录,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
文件系统的一致接口。它在早期得到了一些不好的评论,但现在应该得到错误修正;我自己还没有用过,但你可以看一下。