Experimental keys on scalar is now forbidden

31. August 2019 · Programmierung · andreas · 2 Kommentare

Nach einem Wechsel der Interpreter- oder Compilerversion stolpert die neue Version ab und an über Dinge, die bisher problemlos verarbeitet wurden. Im aktuellen Fall mag Perl 5.28 eine Zeile nicht mehr, die von Perl 5.14 noch problemlos verarbeitet wurde:

Die fragliche Zeile

foreach $type ( keys $phonebook{ $entry } ) {

wird nur noch mit einem

Experimental keys on scalar is now forbidden at scriptname.pl line 123.
Type of arg 1 to keys must be hash or array (not hash element) at scriptname.pl line 123, near "} ) "
Execution of fritzphone.pl aborted due to compilation errors.

und das, obwohl es sich bei “%phonebook” um einen Hash handelt. Die Lösung des Problems ist glücklicherweise recht einfach und schnell erledigt

foreach $type ( keys %{ $phonebook{ $entry } } ) {

in dem der von “keys” auszuwertende Eintrag mit “%{ … }” als Hash gekennzeichnet wird.