Ahh, the power of
regular expressions:
use strict;
use warnings;
my $data;
{
local $/;
$data = <DATA>;
}
my %drives = ();
while ($data =~ /^(\w+)\s*.*?Serial Number\.*(\w*)\s/smg) {
$drives{$1} = $2;
}
while ( my ($key, $value) = each %drives) {
print "$key $value\n";
}
__DATA__
hdisk0 P1/Z1-Aa 16 Bit LVD SCSI Disk Drive (18200 MB)
Manufacturer................IBM
Machine Type and Model......ST318305LC
FRU Number..................09P4437
Serial Number...............0009E05B
Part Number.................09P4436
hdisk1 P1/Z1-Ab 16 Bit LVD SCSI Disk Drive (18200 MB)
Manufacturer................IBM
Machine Type and Model......ST318305LC
FRU Number..................09P4437
Serial Number...............0004A0D2
Part Number.................09P4436
For information on these marvels of modern science, read
perlretut. What I've done in the above is:
- ^(\w+) - Find a line that starts with alphanumeric characters
- \s*.*? - Advance past the smallest amount of arbitrary text until:
- Serial Number - I encounter the phrase 'Serial Number'
- \.* - Advance past an arbitrary number of '.' characters
- (\w*)\s - Find a series of alphanumerics followed by whitespace
The parenthesis capture the results into the variables $1 and $2, which are stored in the hash. The modifiers
s and
m control how new-lines are treated for matching, and the
g modifier makes the while loop repeat so long as a match exists. Also note I localized the default record separator
$/, so the entire data section is read in as a single string.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.