我有部分代码(程序需要为指定用户计算系统上打开文件的总和):
for my $opt_u (@opt_u){
my $generic_acc_open = `/usr/sbin/lsof -u $opt_u | /usr/bin/wc -l`;
chomp ($generic_acc_open);
#print "$open";
print "Number of open files for users:$opt_u[0]=$generic_acc_open**$opt_u[1]=$generic_acc_open\n;"
}
其中opt_u
是cli上指定的用户的参数。
我的问题是当我运行一个程序(./proc_limit -u root jenkins
)时,我得到这样的输出:
Number of open files for users:root=85**jenkins=85
;Number of open files for users:root=13**jenkins=13
我试图在一行中输出,可能是不可能的,因为在这种情况下,数组被指定了两次参数(对于两个用户)。是否可以使用for / foreach循环或者我应该使用其他东西来输出一行如下:
Number of open files for users:root=85**jenkins=13
答案 0 :(得分:1)
您目前正在尝试使用相同的变量$generic_acc_open
打印出两个不同查询的结果。
您需要获取每个用户的结果并单独存储它们。以下是一种可行的方法,适用于任意数量的用户:
print "Number of open files for users: ",
join(" ** ",
map { my $n = `/usr/sbin/lsof -u $_ | /usr/bin/wc -l`;
$n =~ s/\s+//g;
"$_ = $n"
} @opt_u ), "\n";
输出:
Number of open files for users: anonymous = 5548 ** jenkins = 42 ** root = 0
说明:
print "Number of open files for users: ",
# join every member of the array with " ** "
join(" ** ",
# map applies the expressions within the braces to each member of the array @opt_u
# map produces an array as output, which is acted upon by the join function
map {
# get number of open files for user $_
my $n = `/usr/sbin/lsof -u $_ | /usr/bin/wc -l`;
# remove whitespace from the answer
$n =~ s/\s+//g;
# print out the user, $_, and the number of open files, $n
"$_ = $n" } @opt_u ),
"\n";
要打印文件总数,请记录打开的文件数量,并在行尾打印:
my $sum;
print "Number of open files for users: ",
join(" ** ",
map { my $n = `/usr/sbin/lsof -u $_ | /usr/bin/wc -l`;
$n =~ s/\s+//g;
$sum += $n;
"$_ = $n"
} @opt_u ), "; total files: $sum\n";
答案 1 :(得分:0)
print "Number of open files for users:" ;
for my $opt_u (@opt_u){
my $generic_acc_open = `/usr/sbin/lsof -u $opt_u | /usr/bin/wc -l`;
chomp ($generic_acc_open);
print " $opt_u=$generic_acc_open";
}
print "\n";