Simpatico il tuo prof
Non c'è molto di diverso. La tua riga è così:
APDU;80E80003 13 0300 10 01 0C A0 00 00 00 63 504B 43 53 2D 31 35 32 FC 00;9000;

Pare che
ADPU non ti interessa,
80E80003 è un codice progressivo
9000 alla fine è sempre lo stesso

ogni riga che trovi la scorpori, tieni la parte centrale alla quale togli il codice progressivo e fai il confronto sul codice (che tipo di codificazione è esadecimale? Puoi convertire la variabile che cerchi nello stesso modo?) ... comunque:

#!/usr/bin/perl
$tot=""; #per generare il nuovo file
open (FL,"file.csv");
while (<FL> ) #leggo riga per riga
{
if ($_ =~ /ADPU\;/) #guardo solo le righe che contengono il codice ed escludo i commenti
{
#genero l'array separando per ";"
@mom=split(/\;/,$_);
$campo_verifica=substr($mom[1],9,length($mom[1])); #tolgo il numero progressivo
#qui probabilmente devi convertire il codice esadecimale o lo verifichi
#il problema è che io non so che conversione usi

if (condizione per la modifica)
{
#modifica
#rigeneri $_
}
}
$tot="$tot$_";
}
close (FL);

open (FL,">file.csv"); #se non voglio sovrascrivere il file basta cambiare il nome
print FL $tot;
close (FL);

exit;
si semplificherebbe molto se tu potessi convertire la tua variabile all'inizio:
$variabile_convertita=#qui metti il valore della conversione
tutto il resto rimane come nel messaggio precedente: semplice e veloce!
Esempio nel tuo codice al posto di "nachname:Vegliante" metti
$variabile_convertita="13 0300 10 01 0C A0 00 00 00 63 504B 43 53 2D 31 35 32 FC 00"
$variabile_sost="80 00A7 3D 7B 00 B9 03 04 1E 1F 1604 8C 00 FD 87 02 1F 65 16 AD 02 15 05 16 06 1F8B 00 49 70 0A 28 07 11 6A 80 8D 00 A2 AD 02 8B00 79 AD 01 03 AD 00 37 AD "
nella condizione di ricerca:
f ($_ =~ /$variabile_convertita/) ...
nella sostituzione:
$_ =~ s/$variabile_convertita/$variabile_sost/g

però ribadisco, .. bisognerebbe sapere qualcosa in più su quel tipo di codifica.
Spero di averti aiutato