while () { chomp; next unless /^(\S+):\s+(.+)\s*$/; my ($key, $val) = (uc $1, $2); if ($key eq 'DATE') { push @data, $hash if defined $hash; $hash = {}; } $hash->{$key} = $val; } #### use strict; my $hash = undef; my $trap = undef; my @data = (); while () { chomp; next unless /^\s*(\S+):\s+(.+)\s*$/o || /^\s*Trap (\S+):\s+(.+)\s*$/o || /^\s*SNMP (\S+) Generated:\s*$/o; my ($key, $val) = (uc $1, $2); if ($key eq 'DATE') { if (defined $hash) { if (defined $trap) { push @{$hash->{TRAPS}{TRAP_LIST}}, $trap; $trap = undef; } push @data, $hash if defined $hash; } $hash = {}; } elsif ($key eq 'TRAPS') { $hash->{TRAPS} = { TRAP_LIST => [] }; $trap = {}; next; } if ($key eq 'GENERIC' || $key eq 'SPECIFIC' || $key eq 'OID') { $hash->{TRAPS}{$key} = $val; } elsif (defined $trap) { $trap->{$key} = $val; if ($key eq 'DATA') { push @{$hash->{TRAPS}{TRAP_LIST}}, $trap; $trap = {}; } } else { $hash->{$key} = $val; } } if (defined $hash) { if (defined $trap) { push @{$hash->{TRAPS}{TRAP_LIST}}, $trap; $trap = undef; } push @data, $hash if defined $hash; } use Data::Dumper; print Data::Dumper->Dump([\@data]); __DATA__ Date: Mon Feb 17 13:14:19 2003 SServer: formula3 Device: 111.222.123.124 CString: public Port: 162 SNMP Traps Generated: Trap OID: 1.3.6.1.4 Generic: 2 Specific: 0 Varbind: 1.3.6.1.2.1.2.2.1.1 Type: 2 Data: 10 Varbind: 1.3.6.1.2.1.2.2.1.1 Type: 2 Data: 20 Varbind: 1.3.6.1.2.1.2.2.1.7 Type: 2 Data: 20 Varbind: 1.3.6.1.2.1.2.2.1.8 Type: 2 Data: 30 Date: Mon Feb 17 13:14:22 2003 SServer: formula3 Device: 111.164.121.125 CString: public Port: 162 SNMP Traps Generated: Trap OID: 1.3.6.1.4 Generic: 3 Specific: 0 Varbind: 1.3.6.1.2.1.2.2.1.1 Type: 2 Data: 12 Varbind: 1.3.6.1.2.1.2.2.1.1 Type: 2 Data: 20