Perl拆分了一个字符串

时间:2012-08-23 19:50:50

标签: perl

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

我得到的结果是:

Architecture:          x86_64

我希望唯一可以显示的是:

x86_64

4 个答案:

答案 0 :(得分:4)

这不符合你的想法。 The system function运行命令并返回其退出状态;所以在你的情况下,这个:

system($command)

打印Architecture: x86_64,所以:

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

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

然后

print @SplitArch[1]不打印,因为@SplitArch只有一个元素。 (顺便说一下,你可能想写$SplitArch[1]而不是@SplitArch[1],但这既不在这里也不在那里。)

由于您显然打算捕获$command的输出,请改为使用`...` or qx/.../

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

答案 1 :(得分:1)

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

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

要在数组索引#1处打印值,您应该像预期的标量值一样使用$ Sigil:

print $SplitArch[1], "\n";

答案 2 :(得分:0)

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

您应该这样做:

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

希望这有帮助。

答案 3 :(得分: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之外,还涉及少一个外部程序。
  • 更精确地匹配所需的行。