【问题标题】:perl shell command variable errorperl shell 命令变量错误
【发布时间】:2015-03-09 21:05:30
【问题描述】:

我正在尝试在我的一个 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.

怎么了?

【问题讨论】:

  • 可能是$ 之前的(
  • Run Shell command in Perl 的可能副本。提示:有时查找如何做某事比调试您尝试做的错误更容易。在这种情况下,你发明了一些 perl 不支持的$(syntax)
  • @thatotherguy 我也试过ehco 但没用:(
  • 你想要什么输出?在 perl 中你几乎不需要echo
  • 为什么down给这个问题投票?

标签: linux perl shell


【解决方案1】:

这个:

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 中运行命令,您可以:

但是,您在那里枚举目录、字数统计、搜索和阅读。因此,您实际上并不需要使用 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";

反正就是这样。

【讨论】:

  • 啊,是的。好点子。正是出于这个原因,我以前在 while 循环中使用过 glob。已修改。
【解决方案2】:

仅仅print在您的 Perl 脚本中输入一个 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 文件系统的一致接口。它在早期得到了一些不好的评论,但据说现在正在修复错误;我自己没用过,你可以看看。

【讨论】:

  • 太棒了!!你没看错,谢谢你的解释。
猜你喜欢
  • 2017-09-07
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多