On Aug 12, 12:17 pm, [EMAIL PROTECTED] (Mr. Shawn H. Corey) wrote: > Paul Lalli wrote: > > On Aug 11, 7:18 pm, [EMAIL PROTECTED] (Chris Pax) wrote: > >> i have two files > > >> ###########callbacks.pm############### > >> sub foo{ > >> return "foo"; > >> } > > >> sub bar{ > >> return "foo"; > >> } > > >> 1; > >> ################# > > >> ############main.pl############## > >> #!/usr/bin/perl > > >> #PSUDO CODE# > >> #open callbacks.pm > >> #remove 1; > >> #write "sub moo{\n\treturn \"moo\";\n}\n" > >> #write "1;" > > >> package mainprog; > >> use callbacks; > > >> print foo(); > >> print bar(); > >> print moo(); > >> 1; > >> ###################3 > > >> you see here what i want to happen. what I am doing is writing a new > >> function to the callbacks file, then I want to import the file. > > > You have a problem here unrelated to your desire to re-write the > > module. You are declaring subroutines in the package main, but trying > > to call them in package mainprog. Perl won't be able to find those > > subroutines regardless. > > Since the use statement comes after the package statement, the subroutines > are add to that package, not the main. The program will work up to the > subroutine moo, which is not defined. > > > > > Your problem that actually has to do with the question is that you're > > using 'use'. 'use' happens at compile time. That means it happens > > long before the code that re-writes callbacks.pm is executed. You > > need 'require' instead. > > > perldoc -f use > > perldoc -f require > > Actually, 'require' only loads the file once. Since the OP mentioned the > python function reload, I thought 'do' would be more appropriate. > > $ cat script.pl > #!/usr/bin/perl > > use strict; > use warnings; > > our $count = 0; > print "via require...\n"; > for ( 1 .. 10 ){ > require 'perllib.pl'; > > } > > print "via do...\n"; > $count = 0; > for ( 1 .. 10 ){ > do 'perllib.pl';} > > __END__ > $ cat perllib.pl > #!/ > > use strict; > use warnings; > > our $count; > print "\tinc count: ", $count ++, "\n"; > > 1; > __END__ > > ### > > Writing a subroutine to the end of a file would mean that each time the > program is run, a new subroutine is added. The OP probably wants something > like eval (See `perldoc -f eval`) but even that is a last resort. Perl is > powerful enough to do almost everything you want without dynamic programming. > It's only on rare occasions that you have to resort to it. > > -- > Just my 0.00000002 million dollars worth, > Shawn > > "For the things we have to learn before we can do them, we learn by doing > them." > Aristotle thanks you all.
so I tried require and do. I guess its best to explain my goal here. I am using perl for gtk programming. The main code will use the glade bindings and use a separate file for call backs. I want to make it so that if a new callback/function is defined in the glade file, that function will be appended to the callbacks file, with the 1; at the end. this way, you don't half to keep on doing it your self or running some script. ####################### calculator.pl################### #!/usr/bin/perl #################################### ### Main package ## #################################### my $path = $0 ; sub get_old_callbacks{ open CALLS, "calls.pm"; my @calls; while(<CALLS>){ chomp; if(/sub/){ s/sub //; s/{//; #print $_."\n"; push @calls, $_; } } close CALLS; return @calls; } sub in{ #returns true or false $pin = shift @_; @heystack = @_; foreach $item (@heystack){ if ($pin eq $item){ return true; } } return false; } sub get_new_callbacks{ open SIGNAL, "calculator.glade"; my %signals; @oldsignals = get_old_callbacks(); #foreach $osig(@oldsignals){ # $signals{$osig}=""; #} while (<SIGNAL>){ chomp; if(/<signal.*handler="/){ #print "Matched: |$'|\n"; $_=$'; if(/\"\/\>/){ #print $`."\n"; if(not in("$`",@oldsignals)){ $signals{$`}=""; } } } } close SIGNAL; return keys %signals; } sub write_new_callbacks{ open CALLBACKS, "calculatorCallbacks.pm"; @newcalls=get_new_callbacks(); my $data=""; select POOP; while (<CALLBACKS>){ if (/1;/){ s/1;//; } #print "$_\n"; print $_; $data.=$_; } foreach $call(@newcalls){ $data .= "\nsub $call\{\nprint \"this is function '$call\'\";\n}\n"; } $data .= "\n1;\n"; close CALLBACKS; open CALLBACKS, ">calculatorCallbacks.pm"; print CALLBACKS $data; close CALLBACKS; } write_new_callbacks(); package mainprog; use File::Basename; use lib dirname( $0 ); use calculatorCallbacks; use strict ; require Exporter; use vars qw(@EXPORT_OK); @EXPORT_OK = qw ($gladexml); use vars qw($gladexml); use Gtk2 "-init"; use Gtk2::GladeXML; $gladexml = Gtk2::GladeXML->new(dirname( $path )."/calculator.glade"); calculatorCallbacks::init ($gladexml); $gladexml->signal_autoconnect_from_package("calculatorCallbacks"); 1 ; Gtk2->main; ######################################################################## #########################calculatorCallbacks.pm############################# ################################ ### Callback functions ## ################################ use strict; package calculatorCallbacks; use vars qw($gladexml); sub init{ print "initlize\n"; } sub on_quit_activate{ print "function 'on_quit_activate' not implmented\n"; } sub on_fowardinhistory_activate{ print "function 'on_fowardinhistory_activate' not implmented\n"; } sub on_about_dialog_activate{ print "function 'on_about_dialog_activate' not implmented\n"; } sub on_button_press{ print "function 'on_button_press' not implmented\n"; } sub on_backinhistory_activate{ print "function 'on_backinhistory_activate' not implmented\n"; } 1; ###################################### if you can solve the riddle, that would be great. as for now I will read up on all the suggestions made. thanks again -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/