#!/usr/bin/perl use strict; use warnings; my $memory = { lastcode => '', code => '', number => '', name => '' }; while(my $entry = ) { chomp $entry; my ( $code, $number, $name ) = split /\|/, $entry; if ( $code eq '10' ) { $memory = { %$memory, code => $code, number => $number, name => $name, }; } else { if( $code eq '20' and $memory->{code} eq '10' ) { print join("|", map { $memory->{$_} } qw/code number name/) . " $entry\n" unless cmp_memory( $number, $name); } elsif ( $code eq '01' and $memory->{code} eq '10' && $memory->{lastcode} eq '20' ) { print "$entry\n" unless cmp_memory( $number, $name); } } $memory->{lastcode} = $code; } sub cmp_memory { my ( $number, $name ) = @_; return $number eq ( $memory->{number} || '' ) && $name eq ( $memory->{name} || '' ); } __DATA__ 01|1-123-878|Musterfrau 01|1-010-123|Muster 01|1-051-543|Mayer 20|2-123-452|Bauer 01|2-453-345|Huber 10|1-123-134|Max Mustermann 20|1-456-789|Peter Huber 01|1-457-123|Max Mayer