while ($data =~ s!(TI|AU|JN):(.*)?!!s) {
push @{$sections{$1}}, $2;
}
That will build a hash of arrays with the headers as keys. Things you might want to change are as follows:
- With the /s modifier on the regex, . will match newlines. You may not want this (but it makes the regex much more complicated)
- You may not want a hash of arrays. Remove the @ and use the .= operator
- You may want to match a newline after the colon.
This all depends on your data. Personally, I'd use split in a heartbeat. | [reply] [Watch: Dir/Any] [d/l] |
I'm not sure I understand the structure of your
file well enough to answer the question correctly.
From what I understand, though, it seems to me
that you have a file that looks something like this:
TI: ...
AU: ...
JN: ...
TI: ...
AU: ...
JN: ...
and so on. Is the pattern repeating like that?
And so for each section, you have, say, a TI,
an AU, and a JN, and those 3 (or however many)
headers and content constitute one "section"?
The solution that chromatic provided will work
for a structure like this, but the resulting
data structure may not look like you expect. You
could dump it out to see quickly enough what it
looks like, but I just thought I'd explain quickly.
You're going to end up with a hash called %sections,
where the possible headers in the file (TI, AU, and JN)
are the keys, and the values are arrays of all
of the lines pertaining to those sections. So, for
example, say that the 5th "section" in your file
looked like this:
TI: Foo
AU: Bar
JN: Baz
Now you want to get the data for that section.
You can access that information like this:
# the index is 4 because the array index starts
# at 0, btw
my $ti = $sections{'TI'}[4];
my $au = $sections{'AU'}[4];
my $jn = $sections{'JN'}[4];
Just in case it needed explaining. | [reply] [Watch: Dir/Any] [d/l] [select] |
This particular example looks like a WAIS database;
you may want to look into the Wais module
if that's the case. | [reply] [Watch: Dir/Any] |