将数据从文件读取到数组中以在Perl脚本中进行操作?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

这里是一个文件'serverFile.txt'的样本(只是随机扔#)这些字段是名称:CPU利用率:avgMemory用法:disk free

 Server1:8:6:2225410
 Server2:75:68:64392
 Server3:95:90:12806
 Server4:14:7:1548700

我想弄清楚如何将每个字段放入适当的数组中然后执行函数。例如,查找具有最少可用磁盘空间的服务器。

我现在建立的方式,我不认为会工作。那么如何将每行中的每个元素放入数组?

#!usr/bin/perl

use warnings;
use diagnostics;
use v5.26.1;

#Opens serverFile.txt or reports and error
open (my $fh, "<", "/root//Perl/serverFile.txt") 
    or die "System cannot find the file specified. $!";

#Prints out the details of the file format
sub header(){
    print "Server ** CPU Util% ** Avg Mem Usage ** Free Disk\n";
    print "-------------------------------------------------\n";
}

# Creates our variables
my ($name, $cpuUtil, $avgMemUsage, $diskFree);
my $count = 0;
my $totalMem = 0;
header();

# Loops through the program looking to see if CPU Utilization is greater than 90%
# If it is, it will print out the Server details
while(<$fh>) {
    # Puts the file contents into the variables
    ($name, $cpuUtil, $avgMemUsage, $diskFree) = split(":", $_);
    print "$name **  $cpuUtil% ** $avgMemUsage% ** $diskFree% ", "\n\n", if $cpuUtil > 90;
    $totalMem = $avgMemUsage + $totalMem;
    $count++;
}
print "The average memory usage for all servers is: ", $totalMem / $count. "%\n";

# Closes the file
close $fh;
提问于
用户回答回答于

我认为你自己的代码可以改进

  • die "System cannot find the file specified. $!"是错误的:有多种原因open可能导致失败,除此之外“无法找到”。你的die字符串应该包含你想要打开的文件的路径; 失败的原因在于$!
  • 不要使用子程序原型:他们不会做你认为他们做的事。sub header() { ... }应该是公正的sub header { ... }
  • 声明一个子程序仅仅在几行之后调用它是毫无意义的。把你的代码header放在一行
  • 你显然来自另一种语言。my尽可能晚的声明你的变量。仅在这种情况下$count$totalMem必须在while循环之外声明
  • 当程序退出时,perl将关闭所有打开的文件句柄。很少需要明确的close调用,这只会让你的代码更加嘈杂
  • $totalMem = $avgMemUsage + $totalMem 通常是书面的 $totalMem += $avgMemUsage
用户回答回答于

对于这个用例,散列比数组好得多。

#!/usr/bin/perl
use strict;
use feature qw{ say };
use warnings;

use List::Util qw{ min };

my %server;
while (<>) {
    chomp;
    my ($name, $cpu_utilization, $avg_memory, $disk_free)
        = split /:/;
    @{ $server{$name} }{qw{ cpu_utilization avg_memory disk_free }}
        = ($cpu_utilization, $avg_memory, $disk_free);
}

my $least_disk = min(map $server{$_}{disk_free}, keys %server);
say for grep $server{$_}{disk_free} == $least_disk, keys %server;

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励