typhar has asked for the wisdom of the Perl Monks concerning the following question:

I have a piece of code that uses; @arr = sort{ %{ $a }{"tag"} <=> %{ $b }{"tag"} } @arr; and works fine on strawberry perl (windows 12 server). The same line causes a syntax error in v5.16.3 Any ideas? Thanks

Replies are listed 'Best First'.
Re: Having trouble porting code between systems.
by choroba (Cardinal) on Feb 05, 2019 at 22:33 UTC
    In ancient Perl versions, it was possible to use %{ $a }{"tag"} instead of ${$a}{"tag"} which is usually written with the dereference arrow as $a->{tag}. In later versions, the syntax became an error, and in the recent versions, it was introduced for key/value hash slices, where %{ $hash_ref }{ 'key1', 'key2' } returns the corresponding key value pairs, e.g. qw( key1 value1 key2 value2 ).

    So, replace the line with any of

    @arr = sort{ ${ $a }{"tag"} <=> ${ $b }{"tag"} } @arr; @arr = sort{ $$a{"tag"} <=> $$b{"tag"} } @arr; @arr = sort { $a->{tag} <=> $b->{tag} } @arr;

    Update: Interestingly, the old syntax will start working in the recent Perl versions again, because %{ $a }{tag} will return both the string "tag" and its corresponding value, but <=> enforces scalar context to its arguments, so only the last one will be used, i.e. the value of the tag.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]