如何在Perl中打印数组的完整内容

时间:2018-07-27 11:41:06

标签: perl

我有一个如下的代码段

# Get top 10 CPU hogging process
    my $prumObj = OvPrum->new($OVOSystem, $Session);
    my $numprocs = 10;
    my $ProcString= "";
    my $ProcessList = $prumObj->getTopCPUHoggingProcess($numprocs); 
    if ( $ProcessList and scalar(@$ProcessList) )
    {
        $ProcString = "Top ".$numprocs." CPU hogging processes are listed below :\n";
        $ProcString .= "\nCPU   PID Process\n\n";
        foreach ( @$ProcessList)
        {
            $ProcString .= $$_{pctcpu}."    ".$$_{pid}."    ".$$_{args}."\n";
        }
    }

以上代码段的输出为

Top 10 CPU hogging processes are listed below :
% CPU   PID    Process

100    6092     CPUSTRES
6      4252     opcmona

但是我想获取所有字段(而不是%CPU,PID和Process)。如何获取分配给变量ProcString的所有字段?

您能帮我吗

1 个答案:

答案 0 :(得分:2)

首先,您显示的代码是由对Perl不太了解的人编写的。他们在任何具有$$_{pctcpu}之类的构造的地方,真正的Perl程序员都会编写$_->{pctcpu}。他们也不知道变量是插在双引号的Perl字符串中的。因此,最后一行代码实际上是这样写的:

$ProcString .= "$_->{pctcpu}   $_->{pid}    $_->{args}\n";

第二,您需要意识到这里没有人知道OvPrum模块是什么或其工作原理。因此,所有这些都是猜测。

话虽如此。显然,您的getTopCPUHoggingProcess()方法正在返回数组引用,并且所引用数组的每个元素都是哈希引用。

所以我认为您的问题实际上是,“给定一个散列引用数组,我该如何打印该数组中的所有值,而不仅仅是当前代码明确要求的那些值”。我认为下面的代码可以解决这个问题。请注意,我伪造了$ProcessList变量的定义。我的版本肯定不准确,但是它应该足够接近以使您能够了解正在发生的事情。

#!/usr/bin/perl

use strict;
use warnings;

my $ProcessList = [{
  pctcpu => 3,
  pid    => 1000,
  args   => 'something',
  extra  => 'Important data',
}, {
  pctcpu => 2,
  pid    => 2000,
  args   => 'something else',
  extra  => 'Vital data',
}];

my $ProcString = '';

# Get all of the keys of the first hash in the array
my @keys = keys %{ $ProcessList->[0] };

print "@keys\n";

foreach (@$ProcessList) {
  $ProcString .= join(' ', @{$_}{ @keys }) . "\n";
}

print "$ProcString\n";