in reply to Re: Re: Re: save to file: $h{'sub'}=sub{..};
in thread save to file: $h{'sub'}=sub{..};

Sorry, FINAL solution.

Please have a look at the second: print $hash{code},"\n";
It prints a CODE(0x..)-Ref, but is not executable. Any Hints, Thanks, Carl

#! /usr/bin/perl # Write-Read-Execute code # my %hash = (); $hash{code} = sub { print "Hi Guy - Hello Fellow!\n" }; &{$hash{code}}(); print $hash{code},"\n"; my $string = str_Code($hash{code}); $hash{code} = code_String( split(/\n/, $string) ); # this should work (as before saved): print $hash{code},"\n"; &{$hash{code}}(); # the two subs sub str_Code { use B::Deparse; return B::Deparse->new("-p", "-sC")->coderef2text( shift )."\n"; } sub code_String { my $ret; while ( @_ ) { $ret .= (shift)."\n"; # "\n" was eliminated by split } # NOW MAKE $ret been executed: # This is the examlpe of B:Deparse: #eval "sub func $ret"; # but nothing happens # this causes this mistake: # Undefined subroutine &sub #&{$ret}; # this should be given back: return \&{$ret}; }

Replies are listed 'Best First'.
Re^5: save to file: $h{'sub'}=sub{..};
by adrianh (Chancellor) on Jul 13, 2003 at 16:05 UTC

    To be honest I'm not sure what you're trying to do with code_String().

    All coderef2text() does is produce a string that, on eval(), will do what the coderef does. If you want to turn that string into a coderef just wrap it in a sub..

    The following should illustrate.

    #! /usr/bin/perl use strict; use warnings; use B::Deparse; sub str_code { my $coderef = shift; return "sub " . B::Deparse->new("-sC")->coderef2text( $coderef ); } my $coderef = sub { print "Hello world\n" }; print "We have a coderef $coderef\n"; print "Which we can run like this: "; $coderef->(); my $deparsed_coderef = str_code( $coderef ); print "Which we can deparse to this: $deparsed_coderef\n"; my $new_coderef = eval $deparsed_coderef; print "Which we can eval to another coderef $coderef\n"; print "Which we can run just like the original: "; $new_coderef->(); __END__ # produces We have a coderef CODE(0x361a98) Which we can run like this: Hello world Which we can deparse to this: sub { use warnings; use strict 'refs'; print "Hello world\n"; } Which we can eval to another coderef CODE(0x361a98) Which we can run just like the original: Hello world