Tabelle nach Hash

01/07/2011 - 13:26 von Helmut Schneider | Report spam
Hallo,

folgende Tabelle (die um beliebige Zeilen erweitert sein kann, nicht
aber um Spalten):

Name|TotalPhysicalMemory
ZEUS|6441558016

Wie überführe ich die in einen Hash am effizientesten?

Mein allererster Ansatz:

my $count = 0;
my $hash;

foreach my $line (grep !/CLASS/, `$wmic -U $username%$password
//$server "select TotalPhysicalMemory from Win32_ComputerSystem"`) {
chomp($line);
push (@{$$hash{'Win32_ComputerSystem'}{$count}}, split(/\|/,
$line));
$count++;
}

Ich hatte gehofft, irgendwie über 2 Zeilen shiften zu können, aber
vermutlich sehe ich den Wald vor lauter Bàumen nicht. Der Hash sollte
so aussehen:

'Win32_ComputerSystem' => {
'Name' => [
'ZEUS'
],
'TotalPhysicalMemory' => [
'6441558016'
]
}
};

Danke und Gruß, Helmut
 

Lesen sie die antworten

#1 Christian Garbs
01/07/2011 - 19:34 | Warnen spam
Mahlzeit!

Helmut Schneider wrote:

folgende Tabelle (die um beliebige Zeilen erweitert sein kann, nicht
aber um Spalten):

Name|TotalPhysicalMemory
ZEUS|6441558016

Wie überführe ich die in einen Hash am effizientesten?



Ich will nicht behaupten, die effizienteste Lösung zu haben, aber ich
würde es so machen. Wobei ich jetzt den Ziel-Hash nicht besonders
toll finde, ich würde instinktiv eher ein Array über die Rechner
aufmachen und darunter Hashes hàngen, aber ich kenne Deinen
Anwendungsfall ja nicht.

Ach ja, das Codebeispiel kommt auch mit beliebigen weiteren Spalten
zurecht, wenn eine passende Überschrift vorhanden ist. Da habe ich
die Spezifikation verletzt ;-)

Gruß
Christian



#!/usr/bin/perl -w
use strict;
use Data::Dumper;

my %hash;

# Überschriften einlesen
my $line = <DATA>;
chomp $line;
my @head = split /\|/, $line;

# Daten einlesen
while ($line = <DATA>) {
chomp $line;
my @col = split /\|/, $line;
for (my $col = 0; $col < @col; $col++) {
push @{ $hash{'Win32_ComputerSystem'}->{$head[$col]} },
$col[$col];
}
}

print Dumper(\%hash);

__DATA__
Name|TotalPhysicalMemory
ZEUS|6441558016
HERA|68000
ARES|128



($a,$b,$c)=localtime time;sub a{int(31+sin($_[0]/57)*$_[1]).int(#
31-cos($_[0]/57)*$_[1])}for(3..50){$i{a($b*6,$_/3)}++;$i{a($c*30%360+$b/2,$_/5)}
++}for(0..359){$i{a($_,19)}++;$i{a($_,16)}++if!($_%30)}for$y(6..26){for(11..52){
print((' ','"','o','8')[(exists$i{$_.$y*2})*2+exists$i{$_.($y*2-1)}])}print""}

Ähnliche fragen