[Vienna-pm] warum geht {reverse %{$a}}->{pferd} nicht?

Thomas Klausner domm at zsi.at
Thu Jan 12 11:08:45 PST 2006


Hi!

On Thu, Jan 12, 2006 at 04:21:41PM +0100, Stefan Weiss wrote:
> 
> > $a={shiva=>'pferd'};
> > $b={reverse %{$a}};
> > $c=$b->{pferd};
> 
> als auch das hier
> 
> $a = {shiva=>'pferd'};
> $c = {reverse %{$a}}->{pferd};
> 
> funktionieren bei mir problemlos, mit oder ohne 'strict' (This is perl,
> v5.8.5 built for i586-linux-thread-multi).
> 
> Was genau ist das Problem?

Ich denke, dass das hier
 print {reverse %{$a}}->{pferd}
nicht geht, ist das Problem.


#!/usr/bin/perl -w
use strict;
my $a={shiva=>'pferd'};
print {reverse %{$a}}->{pferd};

syntax error at foo.pl line 7, near "}->"
Execution of perter.pl aborted due to compilation errors.


Aber so gehts:

  my $a={shiva=>'pferd'};
  print ~~{reverse %{$a}}->{pferd};

Oder ein wenig weniger obfuskiert:

  my $a={shiva=>'pferd'};
  print scalar {reverse %{$a}}->{pferd};
    

Das Problem ist natuerlich der Kontext:

print erwartet LIST Kontext.

und anscheinend ist {reverse %{$a}}->{pferd} keine Liste, kann aber
von Perl auch nicht als skalar geparst werden; deswegen der Error.

Wenn man jetzt skalaren Kontext erzwingt (durch scalar oder ~~ (ein
alter Obfu-Trick, doppelte bitwise verneinung, also wieder der
Ursprungswert, aber eben auch in skalarem Kontext)) wird 
{reverse %{$a}}->{pferd}
verstanden und in folge auch ausgegeben (oder eben an $c assignet)

Yay, Kontext!

In Summe wuerde ich von dem Trick aber eher absehen. Weil in einem Monat
hat jeder (zumindest ich) vergessen, was das soll. Und wie wir alle
wissen ist man selbst nahezu sicher der naechste Maintainer. Und man
will sich ja nicht unnoetig quaelen.


-- 
#!/usr/bin/perl                               http://domm.zsi.at
for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}


More information about the Vienna-pm mailing list