2010-10-18 3 views
0

Я действительно новичок в Perl, но хочу в основном прочитать в файле, чтобы получить некоторые данные из него. Я хочу проанализировать эти данные в массиве. Почему массив? Потому что я хочу использовать данные для генерации графика (bar или pie данных).Анализ файла в массиве

Вот мой код Perl до сих пор:

#!/usr/bin/perl -w 
use warnings; 

#Creating an array 
my @cpu_util; 

#Creating a test file to read data from 
my $file = "test.txt";  
#Opening the while  
open(DATA, $file) || die "Can't open $file: $!\n"; 

#Looping through the end of the file 
while (<DATA>) 
{ 
if (/(\w+)\s+\d+\s+(\d+)\.(\d+)\%/){ #Getting only the "processes" 
chomp; 
push @cpu_util, split /\t/; #I was hoping this would split the data at the tabs 
} 
} 

close ($file); 

foreach $value (@cpu_util) { 
print $value . "\n"; 
} 

Вот файл, который я читаю в (test.txt):

========================================= 

CPU Utilization 

========================================= 

Name  CPU Time  CPU Usage  

----------------------------------------- 

System    7962   3.00% 

Adobe Photoshop  6783   0.19% 

MSN Messenger   4490   0.01% 

Google Chrome   8783   0.02% 

Idle     120  94.00% 

========================================= 

Однако то, что я замечаю, что я успешно заселить массив, но он не разбивает вкладки и не дает мне многомерный массив. Я действительно не забочусь о поле времени процессора, но я хочу использовать CPU, поэтому я хочу распечатать график XY с осью Y с использованием CPU и осью x, именем процесса.

Я надеялся иметь массив «cpu_util» и имеет cpu_util [0] [0] = System и cpu_util [0] [1] = 3.00. Возможно ли это? Я думал, что раскол/\/t \ ​​позаботится об этом, но, видимо, я ошибся ...

ответ

6

Я думаю, вы хотите, чтобы там был хэш. Ключ будет именем процессора, и значение будет использовать процент. Ты почти там. После успешного матча, использовать захваты ($1 и $2) для заполнения хеш:

my %cpu_util; 
while (<DATA>) 
    { 
    if (/(.*?)\s+\d+\s+(\d+\.\d+)\%/){ #Getting only the "processes" 
     $cpu_util{ $1 } = $2; 
     } 
    } 

use Data::Dumper; 
print Dumper(\%cpu_util); 

Ваша структура данных должна быть намного проще в использовании, а затем:

$VAR1 = { 
      'Google Chrome' => '0.02', 
      'System' => '3.00', 
      'Adobe Photoshop' => '0.19', 
      'Idle' => '94.00', 
      'MSN Messenger' => '0.01' 
     }; 

Ваш split, вероятно, не работает потому что там нет вкладок. На самом деле это не так.

+0

Спасибо Брайан, что сделал трюк. Теперь я попытаюсь посмотреть, как графа данных. Я изучал использование $ 1 и $ 2 с точки зрения Perl, но это все еще не имеет для меня никакого смысла. Не могли бы вы указать мне место, где его хорошо объяснили? Я не понимаю, что именно происходит: > $ cpu_util {$ 1} = $ 2; – c0d3rs

+0

_Learning Perl_ - хорошее место для начала. :) –

-1

Вот ваш код фиксированной ihateme:

use Data::Dumper; 
#use strict; 

#Creating an array 
my @cpu_util; 

#Creating a test file to read data from 
my $file = "bar.txt"; 
#Opening the while 
open(DATA, $file) || die "Can't open $file: $!\n"; 

#Looping through the end of the file 
while (<DATA>) 
{ 
    if (/(\w+)\s+\d+\s+(\d+)\.(\d+)\%/) 
    { 
    chomp; 
    my ($name, $cpuusage, @rest ) = split (/\s+\d+\s+(\d+\.\d+)\%/); 
    push @cpu_util, [$name, $cpuusage ]; 
    } 

} 
close $file; 

print Dumper(\@cpu_util); 
$ref = $cpu_util[0]; # this will set the reference to the first array 
$ref -> [2]; # this will return the 3rd value 
print Dumper ($ref -> [1]); 


$VAR1 = [ 
     [ 
     'System', 
     '3.00' 
     ], 
     [ 
     'Adobe Photoshop', 
     '0.19' 
     ], 
     [ 
     'MSN Messenger', 
     '0.01' 
     ], 
     [ 
     'Google Chrome', 
     '0.02' 
     ], 
     [ 
     'Idle', 
     '94.00' 
     ] 
    ]; 

$ VAR1 = '3,00';

+0

Ты делаешь там слишком много работы. Вам действительно нужен только один матч. Возьмите материал, который вам нужен, в первом матче, чтобы вам не пришлось делать второй. –

Смежные вопросы