Maybe it's just me, but your use of
split() is a little unusual:
... = split(m#\|# => $_, -1);
It's not entirely clear why you're using the arrow '=>' operator
in there when a comma should do just fine. Also, including
a negative number as a parameter seems to request the default
behaviour, so it seems redundant and misleading.
... = split(m#\|#);
Since you're using $_ anyway, and the default behaviour,
you should be able to reference split as such.
With respect to your curious problem, it's not clear why reorganizing
the statements would cause the program to start "working" all of
a sudden, but you could certainly avoid using concatenation and
use the list method of print instead:
print THIRD $_->[0],$id,"|",$key,"|",$cols[0],"|",$_->[0],"\n";
That would seem to be functionally equivalent, and more presentable.