我有一个如下的代码段
# 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的所有字段?
您能帮我吗
答案 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";