thanks a lot Rob
I would like an output without the $VAR...
so I did add this after the push function and it is perfect, thanks a lot again

foreach my $number(@othernumbers){print $rownum,"\t",$elet, "\n";}



#!/usr/local/bin/perl

use strict;
use warnings;

my $fh;

my %results;

open ( $fh, '<', 'temp.txt' ) or die $!;
while ( <$fh> ) {
 chomp;
 my $line = $_;
 my $rownum = substr($line, 0, 1);

 my @othernumbers;
 while ( /(\d{7}-\d{7})/g ) {
  push ( @othernumbers, $1 );
 }

 $results{$rownum} = \@othernumbers;
}
close $fh;

use Data::Dumper;
print Dumper %results;

This should print the results below:

$VAR1 = '1';
$VAR2 = [
          '3206102-3207048',
          '3411782-3411981',
          '3660632-3661428'
        ];
$VAR3 = '2';
$VAR4 = [
          '4481796-4482748',
          '4483180-4483486'
        ];

And this is I believe where you wanted to go. Of course you could just print it directly without the need for the temp variables etc but I assume that you want to do something more with the found values then just dump them on your screen.

Regards,

Rob




On Thu, May 31, 2012 at 11:37 AM, nathalie <n...@sanger.ac.uk <mailto:n...@sanger.ac.uk>> wrote:



    Hi
    I have this format of file: (see attached example)
    1       3206102-3207048 3411782-3411981 3660632-3661428
    2       4481796-4482748 4483180-4483486


    and I would like to change it to this
    1       3206102-3207048
    1       3411782-3411981
    1       3660632-3661428
    2       4481796-4482748
    2       4483180-4483486 .....


    I have tried with this script to create an array for each line,
    and to print the first element (1 or  2) with the rest of the line
    but the output don't seem to be right, could you please advise?
    #!/software/bin/perl
    use warnings;
    use strict;
    my $file="example.txt";
    my $in;
    open(  $in , '<' , $file ) or die( $! );
    #open(  $out, ">>txtout");


    while (<$in>){
       next if /^#/;
       my @lines=split(/\t/);
       chomp;
    for (@lines) { print $lines[0],"\t",$_,"\n"; };


    ouput
    1       1  i don't want this
    1       3206102-3207048
    1       3411782-3411981
    1       3660632-3661428
    1       i don't want this
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1

    1       1
    1       4334680-4340171
    1       4341990-4342161
    1       4342282-4342905
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1

    1       1
    1       4481796-4482748
    1       4483180-4483486
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1

    1       1
    1       4797994-4798062
    1       4798535-4798566
    1       4818664-4818729
    1       4820348-4820395
    1       4822391-4822461
    1       4827081-4827154
    1       4829467-4829568
    1       4831036-4831212
    1       4835043-4835096

    many thanks
    Nathalie




-- The Wellcome Trust Sanger Institute is operated by Genome Research
    Limited, a charity registered in England with number 1021457 and a
    company registered in England with number 2742969, whose
    registered office is 215 Euston Road, London, NW1 2BE.
    --
    To unsubscribe, e-mail: beginners-unsubscr...@perl.org
    <mailto:beginners-unsubscr...@perl.org>
    For additional commands, e-mail: beginners-h...@perl.org
    <mailto:beginners-h...@perl.org>
    http://learn.perl.org/


Hi Nathalie,

Instead of using the split function I would personally go for a regular expression as it allows for a lot more control over what you want to find. Here is my solution...

#!/usr/local/bin/perl

use strict;
use warnings;

my $fh;

my %results;

open ( $fh, '<', 'temp.txt' ) or die $!;
while ( <$fh> ) {
 chomp;
 my $line = $_;
 my $rownum = substr($line, 0, 1);

 my @othernumbers;
 while ( /(\d{7}-\d{7})/g ) {
  push ( @othernumbers, $1 );
 }

 $results{$rownum} = \@othernumbers;
}
close $fh;

use Data::Dumper;
print Dumper %results;

This should print the results below:

$VAR1 = '1';
$VAR2 = [
          '3206102-3207048',
          '3411782-3411981',
          '3660632-3661428'
        ];
$VAR3 = '2';
$VAR4 = [
          '4481796-4482748',
          '4483180-4483486'
        ];

And this is I believe where you wanted to go. Of course you could just print it directly without the need for the temp variables etc but I assume that you want to do something more with the found values then just dump them on your screen.

Regards,

Rob




--
The Wellcome Trust Sanger Institute is operated by Genome Research Limited, a charity registered in England with number 1021457 and a company registered in England with number 2742969, whose registered office is 215 Euston Road, London, NW1 2BE.

Reply via email to