use warnings; use strict; use Cpanel::JSON::XS; our $JSON = Cpanel::JSON::XS->new->allow_nonref; sub to_js { my $what = shift; if (my $r = ref $what) { if ($r eq 'HASH') { return '{' . join(',', map { $JSON->encode("$_").':'.to_js($$what{$_}) } sort keys %$what ) . '}'; } elsif ($r eq 'ARRAY') { return '[' . join(',', map { to_js($_) } @$what) . ']'; } elsif ($r eq 'CODE') { return 'function () { /* some JS here? */ }'; } else { die "can't encode ref $r to JS" } } else { return $JSON->encode($what) } } print to_js( { foo => [ "bar", "quz" ], baz => sub {}, } ), "\n"; __END__ {"baz":function () { /* some JS here? */ },"foo":["bar","quz"]}