vukotid has asked for the wisdom of the Perl Monks concerning the following question:

Hi Perl Monks ,

I need to compare two properties files which contains keys and values in that each file will have multiple values (comma separated values)for a singe key.

Please kindly suggest me how should I go about it as I am a new one for Perl.

Thanks very much in advance.

Ex:- File1:

B23168=AOL,ABC

permitted_mac_attempts=1,DEF

B23167=Carphone Warehouse TalkTalk,23

B23163=Orange,Red,Blue,Green,White,Black

B23970=O2

File2:

B23168=AOL,ABC,DEF,EFG

permitted_mac_attempts=1,DEF,34,4

B23167=Carphone Warehouse TalkTalk,23,5,6

B23163=Orange,Red,Blue,Green,Yellow

B23970=O2,56

  • Comment on Re: How to assign an array to a value in hash?

Replies are listed 'Best First'.
Re^2: How to assign an array to a value in hash?
by Anonymous Monk on Mar 08, 2015 at 03:44 UTC
    Do you have any code? Have you read perlintro?
      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.