Я бы справился с этим, сохранив массив родительских отношений и затем просматривая этот массив при каждом чтении строки:
my @parent;
open my $IN, '<', 'file' or die;
while (<$IN>) {
chomp;
my ($id, $parent, $name) = split /,/;
$parent[$id] = [ $parent, $name ];
if ($parent eq '*') {
print $name;
} else {
my @output = ( [ $parent, $name ] );
while (my $p = $parent[${$output[0]}[0]]) {
unshift @output, $p;
}
print join ',', map { ${$_}[1] } @output;
}
print "\n";
}
close $IN;
Вывод:
ABC
ABC,XYZ
ABC,123
ABC,XYZ,xyz
ABC,XYZ,xyz,xox
ABC,XYZ,yoy
-РЕДАКТИРОВАТЬ - Для обратной связи, пересмотрено, чтобы использовать хэши и не зависеть от порядка файлов:
my %parent;
open my $IN, '<', 'file' or die;
while (<$IN>) {
chomp;
my ($id, $parent, $name) = split /,/;
$parent{$id} = [ $parent, $name ];
}
seek $IN, 0, 0;
while (<$IN>) {
chomp;
my ($id, $parent, $name) = split /,/;
if ($parent eq '*') {
print $name;
} else {
my @output = ( [ $parent, $name ] );
while (my $p = $parent{${$output[0]}[0]}) {
unshift @output, $p;
}
print join ',', map { ${$_}[1] } @output;
}
print "\n";
}
close $IN;