http://qs321.pair.com?node_id=661822


in reply to How to copy an array to a hash?

You are there, ... almost.

All you have to do is split each element from your array into a key and value part.

One possible solution is:

%edit = map {split /\s+=\s+/} @data;

It doesn't make a hash like you wish (with the strange "e101" keys) but that did not make any sense to me, so I went for a more logical solution: the keys are your variable names and the values are the contents of the variables.

But you are re-inventing wheels by making one more configuration handler. Have a look at (for instance) YAML or Config::Auto or Config::Any.

CountZero

A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

Replies are listed 'Best First'.
Re^2: How to copy an array to a hash?
by izut (Chaplain) on Jan 11, 2008 at 07:12 UTC

    This may be useful:

    my $data = do { local $/ = undef; <INFILE> }; my %edit = split /=|\r\n/, $data;

    Hashes are almost like arrays with odd element number. Since split is splitting on new lines and = signs, and you appear to have it this way, it will construct the hash for you.

    Hope this helps.

    Igor 'izut' Sutton
    your code, your rules.

      Good idea! But why use \r\n instead of \n?

      Also it looks like the OP's input file might have empty lines and that could throw the sequence out of sync unless you take special care (perhaps by using \n+ ?).

      CountZero

      A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

        It seems the OP uses Win32, that's the reason I used \r\n :-) I'm sorry, but I'm on Mac OS X so I can't test the input.

        The \n+ trick does the job, like the example below:

        use Data::Dumper; my $input = <<EOI a = 1 b = 2 c = 3 d = 4 EOI ; # clean empty lines $input =~ s/^\s*$//mg; # construct the dictionary from $input my %dict = split m/\s+=\s+|\n+/, $input; print Dumper \%dict;

        Output:

        $ perl test.pl $VAR1 = { 'c' => '3', 'a' => '1', 'b' => '2', 'd' => '4' };

        Hope this helps!

        Igor 'izut' Sutton
        your code, your rules.