my ($p1, $px, $p123, $pwy) = @_;
Werden hier nur die vier ersten Parameter eingelesen, auch wenn 5 angegeben wurden?
Nein, das ist nur eine Zuweisung, das Array @_ bleibt vollständig erhalten.
Falls ja, ginge dann nicht auch
if ($p1 eq 'aaa') {
my $optional = shift;
Nein, damit erhälst du nur den ersten Wert des Array, also das was in $p1 steht.
Du hast zwei Möglichkeiten (neben dem kompletten ändern des Parametertyps)
1. den optionalen Parameter direkt einlesen
my ($p1, $px, $p123, $pwy, $optional) = @_;
2. auf das 5. Element des Arrays @_ zugreifen
my $optional = $_[4];
Struppi.