Du arbeitest einmal mit 
@aitems (1. und 2. Code) und machst die Kontrolle mit 
@auctionItems (3. Code).
Dann sind in den beiden Arrays möglicherweise verschiedene Inhalte.
Aber andererseits:
Mit
$item{$key}{'debugArray'} = join ("|", @auctionItems);
 
 
bekommst Du ja diese Ausgabe:
 'debugArray' => '|HASH(0x24981a0)|HASH(0x2497be8)|HASH(0x249def0)|HASH(0x1d23188)|HASH(0x24982f0)|HASH(0x24983c8)'
 
 
Daran ist am Anfang des Strings zu sehen, dass im Array entweder ein Leerstring '' oder 
undef steckt.
Ansonsten ist es nicht erklärbar, dass beim 
 join('|', @array);  gleich zu Beginn das Trennzeichen '|' steht.
join( '|', 1,2,3 );     
join( '|', "",4,5 );    
join( '|', undef,6,7 ); 
 
 
Ich hoffe, Du benutzt 
use strict; und 
use warnings;.
Wie werden denn diese Arrays (@aItems, @auctionItems) in diesem Code deklariert und initialisiert?
Oder machst Du vielleicht irgendwo 
@aItems = (undef);, um das Array zu leeren?
Dann sollte es klar sein; denn Du weist dem Array hier eine Liste mit einem Element zu. Und dieses Element ist eben 
undef, dass dann natürlich im Array steckt...
Wenn Du ein Array leeren willst, verwende 
@array = (); oder auch 
undef @array;.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!