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

You can use B::Deparse to create a string from a coderef that you can then eval back to the coderef again.

The latest version of Data::Dumper can do this for you. Take a look at the $Data::Dumper::Deparse switch.

Replies are listed 'Best First'.
Re: Re: save to file: $h{'sub'}=sub{..};
by Anonymous Monk on Jul 12, 2003 at 19:10 UTC
    Wow,

    that was fast,
    thanks,
    Carl

Re: Re: save to file: $h{'sub'}=sub{..};
by Anonymous Monk on Jul 13, 2003 at 11:39 UTC
    Hm, well writing a sub to a file works, but how can I use it
    after I've re-read it?

    B::Deparse shows this: eval "sub func $ret". But this doesn't work.
    Either nothing happans or I get a failor, that the sub is not predeclared :-/

    #! /usr/bin/perl # write-read-execute code my %hash = (); # btw, all of a sudden there is a syntax error near: $hash{ # I have no idea why (can't test this, while simular code works?) $hash{'code'} = sub { print "Hi Guy - Hello Fellow!\n" }; &$hash{'code'}(); my $string = toStr($hash{'code'}; $hash{'code'} = toCode( split(/\n/, $string) ); # this should work (as before saved): &$hash{'code'}(); # the two subs sub toStr { use B::Deparse; my $ret .= $deparse->coderef2text( shift )."\n"; $ret .= B::Deparse->new("-p", "-sC")->coderef2text( shift )."\n"; return $ret; } sub toCode { 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; }
    Am I doing s.th. wrong?
    Thanks,
    Carl
      OOPS, please be aware of two minor bugs in sub toStr,
      here is the corrected code (but all other mistaks are still there):
      #! /usr/bin/perl # write-read-execute code my %hash = (); # btw, all of a sudden there is a syntax error near: $hash{ # I have no idea why (can't test this, while simular code works?) $hash{'code'} = sub { print "Hi Guy - Hello Fellow!\n" }; &$hash{'code'}(); my $string = toStr($hash{'code'}; $hash{'code'} = toCode( split(/\n/, $string) ); # this should work (as before saved): &$hash{'code'}(); # the two subs sub toStr { use B::Deparse; return B::Deparse->new("-p", "-sC")->coderef2text( shift )."\n"; } sub toCode { 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; }
        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}; }