juribel hat geschrieben:Code: Alles auswählen
...
# Vor jedem Feld-Marker ein "|" einfügen
$string =~ s/\b([evt][0-9a-f]{3})\b/\|$1/ig;
...
Damit gehst Du davon aus, das dieses Muster nicht in den Daten vorkommt. Wäre die Frage, ob man das tatsächlich ausschließen kann.
Das mit den verschiedenen Arrays ist allerdings schön einfach zugreifbar.
Hier auch nochmal eine Variante, die die Werte in einzelne Arrays für E, V und T speichert:
Code: Alles auswählen
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
use String::Trim;
sub get_next_field {
my $string=$_[0];
$string or return;
my ($id,$length,$rest) = $string =~ /([A-Z])([0-9]+)(.*)/;
my $data = substr($rest,1,hex($length));
$rest = substr($rest,$length);
return $id, $length, $data, $rest;
}
sub parse_string {
my $string = $_[0];
my ($id, $length, $rest, $data, $result);
$result->{"E"} = [];
$result->{"V"} = [];
$result->{"T"} = [];
while (1) {
($id, $length, $data, $rest) = get_next_field($string);
$id or last;
push @{$result->{$id}}, trim($data);
$string = $rest;
}
return $result;
}
sub main {
my ($string,$fh,$result);
open($fh,"<","data.txt");
while( $string = <$fh> ) {
chomp($string);
print "***** NEW LINE *****\n";
print("DATA: ".$string."\n");
$result = parse_string($string);
print Dumper($result);
}
# Ausgabe der ermittelten Felder
print "E => ".join(",",@{$result->{"E"}})."\n";
print "V => ".join(",",@{$result->{"V"}})."\n";
print "T => ".join(",",@{$result->{"T"}})."\n";
close($fh);
}
main();
Ausgabe:
Code: Alles auswählen
$ perl parse.pl
***** NEW LINE *****
DATA: E007 020100 V013 8 20 0 0 0 DEF_OUT T009 0 762060 T009 0 762360
$VAR1 = {
'E' => [
'020100'
],
'T' => [
'0 762060',
'0 762360'
],
'V' => [
'8 20 0 0 0 DEF_OUT'
]
};
E => 020100
V => 8 20 0 0 0 DEF_OUT
T => 0 762060,0 762360
Anmerkung
Ich nutze lieber Referenzen auf Datenstrukturen (Arrays, Hashes oder Kombinationen davon), statt direkt damit zu arbeiten, weil Referenzen Einzelwerte sind, die sich leichter als Gesamtdatenstruktur übergeben lassen.