4

Basically I have a perl script in which I have an array (where each element of the array references a hash) and need to be able to print the array with a dumper function. Thus I need to be able to split the $line on white spaces and save into variables and then construct anonymous hash and push into @genes:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper; # print complex data structure
my @genes; # declare the array
while(<>) { # this means that as long as lines come from the pipe we keep going
  my $line = $_; # a line that come from the pipe (we go line by line)
  next unless $line =~ /^\d+/; # skip lines except those reporting genes 
  <split the $line on white spaces and save into variables>
  <anonymous hash and push into @genes>
}
print Dumper(\@genes);
exit;

I don't even know how to approach this, this is my first time perl scripting and I am really confused. Any insight would be extremely helpful.

So far I have:

my $gene = {'id' => $id, 'start' => $start, 'end' => $end, 'frame' = $frame, 'score' => $score};
my @line_split = split(' ', $line);
my $id = $line_split [0], $start = $line_split [1], $end = $line_split [2], $frame = $line_split [3], $score = $line_split [4]
gringer
  • 14,012
  • 5
  • 23
  • 79
code_pink
  • 63
  • 3
  • What is the format of mys.coord2? – Alex Reynolds Mar 14 '18 at 06:19
  • 00001 16 324 +1 0.929 00002 751 308 -2 0.911 – code_pink Mar 14 '18 at 08:25
  • simply just contains two lines – code_pink Mar 14 '18 at 08:25
  • Hi code_pink now the question is more specific, but we still don't know how is it failing, or why. Could you [edit] it further to include this information? Also if you would like to have some guidance explaining your reasoning with your code would be useful to explain why it is a good direction or not (this is a great tool to find the way to code). Also if you mark one answer as accepted, people (usually) won't answer further. – llrs Mar 15 '18 at 16:30

2 Answers2

6

Perhaps this small test script will help demonstrate some of the principles:

#!/usr/bin/env perl                                                                                                                                              

use strict;
use warnings;
use Data::Dumper;

my @arr;

# define the current line    
my $line = "foo\tbar\tbaz\n";

# remove the trailing newline character
chomp $line; 

# put the line's elements into an anonymous array
my ($a, $b, $c) = split('\t', $line);

# insert key-value pairs into anonymous hash    
my $hash = {a => $a, b => $b, c => $c};

# add the hash table to the array
push @arr, $hash;

# print the array
print Dumper \@arr;

Run this script and see what it prints out.

Alex Reynolds
  • 3,135
  • 11
  • 27
  • `my ($id, $start, $end, $frame, $score) = split(' ', $line);
    my $hash = {id => $id, start => (at) start, end => (at)end, frame => (at) frame, score => (at) score};`
    
    – code_pink Mar 14 '18 at 09:16
  • is this sort of in the right direction – code_pink Mar 14 '18 at 09:17
  • my ($id, $start, $end, $frame, $score) = split('\t', $line); my $hash = (id => $id, start => $start, end => $end, frame => $frame, score = $score); – Alex Reynolds Mar 14 '18 at 09:23
  • Sorry, that should be: my $hash = { ... } not using parentheses, but brackets. I can't edit my previous comment so hopefully this helps. – Alex Reynolds Mar 14 '18 at 18:46
2

The following Perl documentation pages should be informative:

  • split - for splitting a scalar at all matches of a defined pattern
  • perlreftut - discusses the approach of anonymous variables and how to combine them
gringer
  • 14,012
  • 5
  • 23
  • 79