I'm sort of new to this, so maybe this is just 'baby talk', but this has always worked for me:
push @arr, $el if !$seen{$el}++;
The hash value $seen{$el} is not incremented until after the test and so is always zero the first time through, non-zero thereafter.