in reply to sorting a hash that's in another file

Assuming that the reason you don't want to execute the script is because the script contains other stuff besides the hash, then something like this might work. The regex is far from foolproof, but short of writing a Parse:RecDescent grammer to match perl, which is a very tall order, you might get away with the following (with a little tweaking as necessary).

It requires that none of the keys or values in the hash is likely to contain the sequence ');' and that the hash declaration is finished with that sequence. If that isn't true, then move on to the next idea:)

#! perl -slw use strict; use Data::Dumper; my $data = do{ local $/; <DATA> }; my %hash = eval "$1" if $data =~ m[ \n%some_hash\s*=\s* ( \( .* \); ) ]sx; print Dumper \%hash; my %newHash; for my $state (keys %hash ) { push @{ $newHash{ $_ } }, $state for split /\s*,\s*/, $hash{ $state }{colors}; } print Dumper \%newHash; __DATA__ Various other perl statements before the hash definition Various other perl statements before the hash definition Various other perl statements before the hash definition Various other perl statements before the hash definition Various other perl statements before the hash definition Various other perl statements before the hash definition %some_hash = ( 'NEW_YORK' => { 'capital' => 'Albany', 'colors' => 'black, green, blue', 'bird' => 'pigeon' }, 'MASSACHUSETTS' => { 'capital' => 'Springfield', 'colors' => 'red, white, blue', 'bird' => 'turkey' } # etc ); Various other perl statements after the hash definition Various other perl statements after the hash definition Various other perl statements after the hash definition Various other perl statements after the hash definition Various other perl statements after the hash definition Various other perl statements after the hash definition Various other perl statements after the hash definition

Output

P:\test>277327 $VAR1 = { 'MASSACHUSETTS' => { 'bird' => 'turkey', 'colors' => 'red, white, blue', 'capital' => 'Springfield' }, 'NEW_YORK' => { 'bird' => 'pigeon', 'colors' => 'black, green, blue', 'capital' => 'Albany' } }; $VAR1 = { 'green' => [ 'NEW_YORK' ], 'white' => [ 'MASSACHUSETTS' ], 'black' => [ 'NEW_YORK' ], 'blue' => [ 'MASSACHUSETTS', 'NEW_YORK' ], 'red' => [ 'MASSACHUSETTS' ] };

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller

Replies are listed 'Best First'.
Re: Re: sorting a hash that's in another file
by alienhuman (Pilgrim) on Jul 24, 2003 at 13:55 UTC

    First off, I'd like to say thanks to everyone who has contributed to this thread. You've all helped me immensely--either by code examples or by giving me perspective on my problem.

    I think I've run into a problem that may require me to rethink the process by which I grab these values. It turns out that some of the hashes in %some_hash have different numbers of elements. So it looks something like:

    %some_hash = ( 'NEW_YORK' => { 'capital' => 'Albany', 'colors' => 'red, white, blue', 'bird' => 'pigeon' }, 'MASSACHUSETTS' => { 'capital' => 'Springfield', 'colors' => 'green, yellow', } # etc );

    This is forcing me to rethink the entire process, and will probably mean that we break %some_hash out into its own file (as some of you suggested). Also my colleague just told me that the utility of what I'm doing (this is a pet project) is somewhat limited for other reasons related to the function of the original script.

    But that doesn't temper my gratitude for the attention I've recieved. Thank you Monks. I learned a lot here.

    AH