# Produce string representation of a hash whose ref is given as the # first parameter. # other parameters are options: # --email-style - email headers style # --key-order=k1,k2... - key order (other keys are alphabetically # appended) # # Union and intersection subroutines required. # sub toString($@) { my $x = shift; my $emailstyle = ''; my @keyorder = (); while (@_) { my $o = shift; if ($o eq '--email-style') { $emailstyle = 1 } elsif ($o =~ /^--key-order=/) { @keyorder = split(',', $') } else { die "unknown option:$o" } } my $r; if (ref($x) eq "HASH") { my @keys = intersection( [union(@keyorder, sort(keys(%{ $x })))], [keys(%{ $x })] ); if (not @keys) { return "{ }" unless $emailstyle; die "don't know how to represent empty hash in email style"; } if (not $emailstyle) { $r = "{\n" } foreach my $k (@keys) { my $v = $x->{$k}; if ($emailstyle) { $r .= "$k:$v\n" } else { $k =~ s/\\/\\\\/g; $k =~ s/'/\\'/g; $v =~ s/\\/\\\\/g; $v =~ s/'/\\'/g; $r .= " '$k' => '$v',\n"; } } $r =~ s/,\n$/\n}\n/; return $r; } else { die "not yet implemented ref=: ".ref($x) } }