#!/usr/bin/perl use Inline C; use strict; my $foo = "bar"; my $bar = [qw(foo bar baz)]; my $baz = {foo => "bar", baz => "quux"}; my $x = [ {foo => "bar", baz => "quux"}, {foo => "bar", baz => "quux"}, {foo => "bar", baz => "quux"}, ]; my $y = { foo => ["bar","quux"], baz => ["quux","bar"], }; print q("foo" -> ), describe("foo"), "\n"; print q(\\$foo -> ), describe(\$foo), "\n"; print q($bar -> ), describe($bar), "\n"; print q(\\$bar -> ), describe(\$bar), "\n"; print q($baz -> ), describe($baz), "\n"; print q(\\$baz -> ), describe(\$baz), "\n"; print q($x -> ), describe($x), "\n"; print q(\\$x -> ), describe(\$x), "\n"; print q($y -> ), describe($y), "\n"; print q(\\$y -> ), describe(\$y), "\n"; __END__ __C__ SV* describe( SV *var ) { SV *tmp; if( ! SvROK( var ) ) { return( newSVpvf( "%s", "S" ) ); } else { switch( SvTYPE( SvRV(var) ) ) { case SVt_PVAV: tmp = describe( av_pop( (AV *)SvRV(var) ) ); return( newSVpvf( "Ao%s", SvPV( tmp, PL_na ) ) ); case SVt_PVHV: tmp = describe( hv_iterval( (HV *)SvRV(var), hv_iternext( (HV *)SvRV(var) ) ) ); return( newSVpvf( "Ho%s", SvPV( tmp, PL_na ) ) ); case SVt_PVCV: return( newSVpvf( "%s", "C" ) ); case SVt_PVGV: return( newSVpvf( "%s", "G" ) ); case SVt_PVMG: return( newSVpvf( "%s", "B" ) ); case SVt_RV: tmp = describe( SvRV(var) ); return( newSVpvf( "r%s", SvPV( tmp, PL_na ) ) ); case SVt_IV: case SVt_NV: case SVt_PV: return( newSVpvf( "%s", "oS" ) ); default: return( newSVpvf( "?" ) ); } } }