in reply to Re: Re: Z80 Assembler -> Hex Opcode
in thread Z80 Assembler -> Hex Opcode

With the example I posted %opcodes is in main::, so too the sub is in main:: - ergo and therefore same scope, no errors, runs as posted. You don't need the use vars *and* the my declaration for %opcodes. One or the other will pacify strict...

# declare this in implicit main:: package my %here = ( in => ' main' ); run(); sub run { # we are still in main:: here, so we can access %hash just fine print "I am still ", %here }

cheers

tachyon

s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Replies are listed 'Best First'.
Re: Re: Re: Re: Z80 Assembler -> Hex Opcode
by Elgon (Curate) on Feb 09, 2003 at 14:58 UTC

    Ah, found the problem,

    a) poor understanding of scoping on my part and b) when I first ran as you described, I had the declaration of %opcodes after the main loop containing the call to encode() so, in effect, the declaration never took place until after the program had effectively run its course.

    You live and learn.

    Elgon

    "What this book tells me is that goose-stepping morons, such as yourself, should read books instead of burning them."
           - Dr. Jones Snr, Indiana Jones and the Last Crusade

      Declaring hash structures within subs that get repeatedly called is a common problem. Another solution that allows the hash to be declared on demand (if the sub may or may not be called this is good) but still only be called once is to use a closure like this:

      { my %hash; sub my_sub { unless (%hash) { %hash = ( blah ); } } } # %hash is not accessible here, this is a different one my %hash...

      Doing it this way makes %hash private to the sub as the my delaration localises it to the bare block where it is accessible to the sub but not main:: per se. You start the sub by checking if the hash is populated. On the first call to the sub it will not be so you set it. From then on it will populated so you don't need to set it again during subsequent calls to the sub. Perl retains a reference to it between calls to the sub so it never gets garbage collected.

      cheers

      tachyon

      s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print