in reply to Re: Adding text file data to hashes and array
in thread Adding text file data to hashes and array

Hi thanos1983,The code which was shared by you absolutely brilliant piece of code and helped me a lot but what if there is a bit change in the text file mentioned below input file.I have tried but i am getting the output as {''=>[],Apple =>[A,40,45,50,54]} with first line empty and actual data is starting after the comma seperation & A in displaying in an array actually it has to dispay as {Apple-A =>[40,45,50,54]} .Any help is appreciated

Below is the code used to achieve the output

use strict; use warnings; use IO::All; use Data::Dumper; my @elements =(); my @lines = io('test_scores.txt')->chomp->slurp; splice @lines, 0, 1; # remove first line my %hash; foreach my $line (@lines) { $line =~ s/^\s+//; my @elements = split /\s+/, $line; $hash{splice @elements, 0, 1} = \@elements; } print Dumper \%hash;

below is the Input file

fruit Jan feb mar apr Apple A 40 45 50 54 orange O 12 25 24 29 Pineapple P 10 20 30 40

output should be as below

{Apple-A =>[40,45,50,54]}

Replies are listed 'Best First'.
Re^3: Adding text file data to hashes and array
by poj (Abbot) on Feb 14, 2019 at 10:25 UTC

    Make the key by joining the first 2 fields. see splice and join

    foreach my $line (@lines) { $line =~ s/^\s+//; my @elements = split /\s+/, $line; my $key = join '-',splice @elements, 0, 2; # 2 col key $hash{$key} = \@elements if length($key) > 0; # no blank keys }
    poj

      Hi Poj your code has worked for me,thank you so much but actually in the output i am gettingvar$1={'apple-A'=>['30','40','50','60']}

      How to get rid of the single quotes for the values 30,40,50,60

      input file data

      name jan feb mar apr apple 30 40 50 60 orange 25 54 45 45

      Please find the code below

      #!/usr/bin/perl use strict; use warnings; use IO::All; use Data::Dumper; my @lines = io('test_Scores.txt')->chomp->slurp; splice @lines, 0, 1; # remove first line my %hash; foreach my $line (@lines) { $line =~ s/^\s+//; my @elements = split /\s+/, $line; my $key = join '-',splice @elements, 0, 2; $hash{$key} = \@elements if length($key) > 0; } print Dumper \%hash;
        i am gettingvar$1={'apple-A'=>['30','40','50','60']}

        That is the default Data::Dumper format. Use either

        $Data::Dumper::Useqq = 1; print Dumper \%hash;

        or dump the values as your original post.

        for my $key (sort keys %hash) { printf "%-12s %s\n",$key,join ' ',@{$hash{$key}}; }
        poj
        How to get rid of the single quotes for the values 30,40,50,60

        Data::Dumper is a debugging tool, I would not use it to get consistently formatted output. Because Perl transparently converts between strings and numbers, 30 and "30" are practically the same thing, and so modules such as Data::Dumper have to more or less "guess" in which format to output such values. This kind of question actually comes up often when serializing Perl data structures, and usually the solution ends up being some custom code (one example: Cpanel::JSON::XS::Type).

        So I guess the question is, why do you need the output in this format, and could you give a longer specification of the expected output format?

Re^3: Adding text file data to hashes and array
by haukex (Archbishop) on Feb 14, 2019 at 09:42 UTC

    The code you posted in the root node works for this case...