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:

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);

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]
  • $\begingroup$ What is the format of mys.coord2? $\endgroup$ Commented Mar 14, 2018 at 6:19
  • $\begingroup$ 00001 16 324 +1 0.929 00002 751 308 -2 0.911 $\endgroup$
    – code_pink
    Commented Mar 14, 2018 at 8:25
  • $\begingroup$ simply just contains two lines $\endgroup$
    – code_pink
    Commented Mar 14, 2018 at 8:25
  • $\begingroup$ 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. $\endgroup$
    – llrs
    Commented Mar 15, 2018 at 16:30

2 Answers 2


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.

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

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.