in reply to Re: How to assign an array to a value in hash?

Do you have any code? Have you read perlintro?
  • Comment on Re^2: How to assign an array to a value in hash?

Replies are listed 'Best First'.
Re^3: How to assign an array to a value in hash?
by vukotid (Initiate) on Mar 09, 2015 at 10:35 UTC
    Yeah , I have some code. I wanted to get like the below one

    Ex:-

    Key1=value1;

    key2=value2,value3,..value10;

    key3=value11,value12

    I wanted to get like this

    key1=value1

    key2=value2

    key2=value3

    key2=value4

    key3=value11

    key3=value12

    After spliting the comma separated values Ex:- value2,value3,valuen not able to insert them into hash.

    Some one please kindly help me to insert the splitted values and its key into a hash.

    open(DATA1,"<Switcher.properties"); open(DATA2,">FileWrite5.txt") ; while(<DATA1>){ print DATA2 $_; } close(DATA1); close(DATA2); open(DATA1,"<Switcher.properties"); my @Lines=<DATA1>; my %myHash; my @keys; my @y; my @values; my $p=0; my @i; my @x; my $k; foreach my $val (@Lines) { #print "$val"; @i=split('=',$val); $x=0; @keys=@i[x]; @values =@i[$x+1]; print " Keys --> @keys values --> @values \n"; @keys = @i[$x+2]; my $z= @i[$x]; print " The z value--> $z\n"; foreach my $val (@values) { if($val=~m/,/){ @y= split(',',$val); $k=0; foreach my $q (@y){ $myHash{$z}=$q ; print " The value of q --> $q The key for that is --> @i[$x] \n \n "; } print " Key --> @i[$x]\n Multiple values for the key are --> @y "; $k++; } } $x++; $p++; } print " Hash values are as below \n"; while ( my($key,$value)= each %myHash){ print "$key : $value\n " ; }

      Please, use strict, use warnings, and format/indent your code properly. You'll save yourself a LOT of headaches that way.

      Now, that said, a hash can by its very nature only contain one value for the same key. So simply assigning to the same key more than once won't work, as you'll just overwrite any old value that might previously have been associated with that key.

      However, the value can be a reference to an array (or any data structure, really). perldsc has more information on this, but here's how I might do it:

      #!/usr/bin/perl use strict; use warnings; use feature qw/say/; my %parsed = (); while(<DATA>) { chomp; my ($key, $values) = split "=", $_, 2; my @values = split ",", $values; $parsed{$key} = \@values; } foreach my $key (sort keys %parsed) { say "$key: "; foreach my $value (@{ $parsed{$key} }) { say "\t$value"; } } __DATA__ key1=value1 key2=value2,value3,value4,value4,value5,value6,value7,value8,value9,va +lue10 key3=value11,value12

      This outputs:

      $ perl 1119309.pl key1: value1 key2: value2 value3 value4 value4 value5 value6 value7 value8 value9 value10 key3: value11 value12 $

      The crucial lines here are the following two:

      $parsed{$key} = \@values; # ... foreach my $value (@{ $parsed{$key} }) {

      The first of these takes a reference to @values (using the \ operator); the second takes the reference stored in $parsed{$key} and dereferences it, i.e. converts it back to to an array, by using the @{ ... } circumfix construct. (Since @ is the array sigil, this can mnemonically be thought of as encapsulating a certain something and presenting it as an array on the outside.)

      I hope this'll get you started! If you have further questions, just ask.

        Hi Thanks very much for the hot fix to my problem.

        Actually I need to compare two different versions of the same properties file and than should bring the changes into .csv file.

        Now the question is how I should compare and get the changes of those two hashes of arrays and write it into .csv file.

        Please kindly suggest me the approach.

        Thanks

        Dhananjaya V