4
$\begingroup$

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

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.

$\endgroup$
  • $\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 Mar 14 '18 at 9:16
  • $\begingroup$ is this sort of in the right direction $\endgroup$ – code_pink Mar 14 '18 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$ – Alex Reynolds Mar 14 '18 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$ – Alex Reynolds Mar 14 '18 at 18:46
2
$\begingroup$

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
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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