Ich bin mit einem großen Datenmenge arbeiten, die im Grunde wie dies auf etwas kocht:Elegant Parsing Starre Daten in Perl
my $input = q(
<foo>111</foo>
<foo>222</foo>
<foo>333</foo>
<foo></foo>
<foo>555</foo>
); # new-lines are either CR+LF, LF, or CR
Basierend auf dem obigen Beispiel, nehmen wir an, dass die folgenden Einschränkungen in Kraft sind:
- Es wird immer 5 Datenzeilen geben.
- Daten in jeder Zeile sind in einem einzelnen Tag eingeschlossen, z. B.
<foo>...</foo>
. - Daten enthalten keine verschachtelten Tags.
- Alle Zeilen verwenden das gleiche Tag (z. B.
foo
), um ihre Daten zu umschließen.
Letztlich die oben als Datenquelle nehmen, würde ich mit etwas, um am Ende wie ähnlich diese:
my %values = (
one => '111',
two => '222',
three => '333',
four => '',
five => '555'
);
Dies ist mein Versuch:
my @vals = $input =~ m!<foo>(.*?)</foo>!ig;
if (scalar @vals != 5) {
# panic
}
my %values = (
one => shift @vals,
two => shift @vals,
three => shift @vals,
four => shift @vals,
five => shift @vals
);
Das funktioniert, wie ich will, aber es sieht hässlich aus und ist nicht sehr flexibel. Leider ist dies das Beste, was ich tun kann, seit ich neu bei Perl bin.
Also, angesichts der oben genannten Einschränkungen, was ist eine elegantere Möglichkeit, dies zu tun?
Das letzte Beispiel ist wirklich ordentlich. Vielen Dank! – jnaturelle
Das letzte Beispiel * ist * irgendwie ordentlich, nimmt aber eine feste Anzahl von Schlüsseln an.Wenn Sie möchten, dass es flexibler ist und die Schlüssel generiert, während Sie weitermachen, "ordnen" Sie sich einer Liste mit einer geraden Größe zu (und weisen Sie diese Liste dem Hash zu). 'map' und' grep' sind Freunde. :) – fennec