Greetings; Thanks for all that tuteledge. Now if you could expand it to handle
# processors : 3 col 1...5...10....5...20 that would be great! Apparently on my ver of linux something is supposed to see this as a comment and ignore it. TIA, Dennis >}On Apr 29, 14:12, Michael Lamertz wrote: >} Subject: Re: Getting contens of file into a hash >On Mon, Apr 29, 2002 at 11:59:42AM +0100, Anders Holm wrote: >> Hi folks! >> >> Could someone point me in the right direction on this one. >> >> I'm trying to input /proc/cpuinfo >> on a Linux box into a hash. This file >> contains information of the processors on the running machine, what type >> they are, number of cpu's etc. and I want to use this info later. > >Ok, let's look at the data: > > ---------- snip ---------- > nijushiho:~$ cat /proc/cpuinfo > processor : 0 > vendor_id : GenuineIntel > cpu family : 6 > model : 8 > model name : Pentium III (Coppermine) > stepping : 6 > cpu MHz : 798.266 > cache size : 256 KB > fdiv_bug : no > hlt_bug : no > f00f_bug : no > coma_bug : no > fpu : yes > fpu_exception : yes > cpuid level : 2 > wp : yes > flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat >pse36 mmx fxsr sse > bogomips : 1592.52 > > nijushiho:~$ > ---------- snip ---------- > >> Now the problem I have is that I'd like to get it into a hash, and I just >> can't figure out how to do this. I can split it up at the : delimiter, but >> I'm not sure how then to get in the data in a hash properly. > >You're right on track (with some exceptions, but read about that further >down the page). > > my ($key, $value) = split /:/; > >will give you e.g. > $key "cpu family" > $value "6" > >You access the "cells" of a hash via their 'key', and you write the >value into that cell by using an assignment. > > $hash{$key} = $value > >Note that most beginners consider it funny that it's written > > $hash{$key} > >and not > > %hash{$key} > >The reason for the notation is that the leftmost character describes >what you have in hand, and not what 'hash' is. So '$hash{$key}' means > > The *SCALAR* inside the hash '%hash' at position '$key' > > >The same goes for accessing the content of the hash when reading it out >later. > > print $hash{'cpu family'} > >For more information about hashes read > > perldoc perldata > > perldoc perldsc > perldoc perlreftut > perldoc perlref > >Start with the first one. The other three will too soon lead you to >'references' which will add an indirection layer to all your data. Go >with the basics first, and once you've grokked that, go for the latter. > >> More than likely I'm describing this completely wrong, but hey, I'm a >> newbie.. ;) > >Nope, that was pretty ok. > > >Ok, now on to some discussion the use of 'split' here: > >*IF* you have full control over your input data, using split is just >fine. If, however, you're relying on others to not change their output >you're on thin ice. > >Of course you need to make assumptions about the data you're working >with, but you should optimize on rubustness. > >So if someone decides that there's a terrible cool feature for xmyrgl >CPUs called effectiveness that's to be displayed as a ratio > > xmyrgle fx : 3:2 > >split will give you > > 'xmyrgle fx', 3, 2 > >and since you only assigned that to two variables, your information will >be broken. > >A much saner assumption would be that everything up to the first colon >will be the key and all the rest will be the value > > my ($key, $val) = /\s* # Skip leading whitespace > ([^\:]*?) # Start with everything not ':' > # minimize so whitespace gets eaten by >next statement > \s* : \s* # Allow whitespace around ':' > (.*?) # Slurp in all the rest, > # minimizing again > \s* # Catch trailing whitespace > $/x; # x allows fancy display and commenting of >regexp > >Well, that code will break too if somebody considers it cool to use a >colon inside the name field, but in that case, you'll still have all the >information available. Nothing is lost, nothing gets thrown away except >for the whitespace and the colon. > >Proof of concept: > > ---------- snip ---------- > nijushiho:~$ (cat /proc/cpuinfo; echo ' xmyrgle fx : 3:2 ') |\ > > perl -MData::Dumper -lane '/\s*([^\:]*?)\s*:\s*(.*?)\s*$/ or next; > > $hash{$1} = $2; > > END { print Dumper(\%hash) }' > $VAR1 = { > 'coma_bug' => 'no', > 'flags' => 'fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov >pat pse36 mmx fxsr sse', > 'cpu MHz' => '798.266', > 'wp' => 'yes', > 'f00f_bug' => 'no', > 'processor' => '0', > 'xmyrgle fx' => '3:2', # <=== TADAAA > 'bogomips' => '1592.52', > 'vendor_id' => 'GenuineIntel', > 'stepping' => '6', > 'cpuid level' => '2', > 'model name' => 'Pentium III (Coppermine)', > 'hlt_bug' => 'no', > 'model' => '8', > 'fpu' => 'yes', > 'cache size' => '256 KB', > 'fdiv_bug' => 'no', > 'fpu_exception' => 'yes', > 'cpu family' => '6' > }; > > nijushiho:~$ > ---------- snip ---------- > >Just some "food for thought" (tm)... > >PS: use '//x'! > >-- > If we fail, we will lose the war. > >Michael Lamertz | +49 221 445420 / +49 171 6900 310 >Nordstr. 49 | [EMAIL PROTECTED] >50733 Cologne | http://www.lamertz.net >Germany | http://www.perl-ronin.de > >-- >To unsubscribe, e-mail: [EMAIL PROTECTED] >For additional commands, e-mail: [EMAIL PROTECTED] > >}-- End of excerpt from Michael Lamertz -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]