0
#!/usr/bin/perl
$command="lscpu | grep -i Architecture";
#$arch = system($command);
@SplitArch = split(/:/, system($command));
print @SplitArch[1];

我得到的结果是:

Architecture:          x86_64

我希望唯一会显示的是:

x86_64
4

4 回答 4

4

这并不像你认为的那样。system函数运行命令并返回其退出状态;所以在你的情况下,这个:

system($command)

打印Architecture: x86_64,所以这个:

@SplitArch = split(/:/, system($command));

打印Architecture: x86_64并设置@SplitArch(0).

print @SplitArch[1]然后什么也不打印,因为@SplitArch只有一个元素。(顺便说一句,您可能打算写$SplitArch[1]而不是@SplitArch[1],但这既不是这里也不是那里。)

由于您显然打算捕获 的输出$command,请使用`...`qx/.../代替:

@SplitArch = split(/:/, `$command`);
于 2012-08-23T19:56:16.087 回答
1

如果要获取命令的输出,则应使用qx{}运算符:

my @SplitArch = split /:/ qx{$command};

并且要打印数组索引 #1 处的值,您应该使用$Sigil,因为您期望一个标量值:

print $SplitArch[1], "\n";
于 2012-08-23T19:56:25.080 回答
0

我相信 System 的返回值是命令的退出值,而不是输出。

你也许应该这样做:

$output = `$command`;
@SplitArch = split(/:/, $output);

希望这可以帮助。

于 2012-08-23T19:57:53.733 回答
0

已经给出的解释—— system没有返回你认为的结果——我只是提供了一个替代解决方案。

open(my $LSCPU, '-|', 'lscpu') or die $!;
while (<$LSCPU>) {
   chomp;
   my ($key, $val) = split(/:\s*/, $_, 2);
   if ($key eq 'Architecture') {
       print "$val\n";
       last;
   }
}
close($LSCPU);

优点:

  • 尽快退出。
  • 不涉及外壳。
  • 除了 shell 之外,还少了一个外部程序。
  • 更精确地匹配所需线路。
于 2012-08-23T19:58:59.113 回答