Pregunta

Estoy tratando de leer valores de un archivo de entrada en Perl. archivo de entrada se ve así:

1-sampledata1 This is a sample test
              and data for this continues
2-sampledata2 This is sample test 2
              Data for this also is on second line

quiero leer los datos anteriores para que los datos de 1-sampledata1 entra en @array1 y datos para 2-sampledata2 va en @array2 y así sucesivamente. Voy a tener alrededor de 50 secciones de este tipo. como 50-sampledata50.

Editar : Los nombres suele ser siempre X-sampledataX. Acabo de hacer que, por ejemplo. Así que los nombres no pueden estar en un bucle. Creo que voy a tener que escribir manualmente

I hasta ahora tengo el siguiente (que funciona). Pero estoy en busca de una manera más eficiente de hacer esto ..

foreach my $line(@body){
        if ($line=~ /^1-sampledata1\s/){
                $line=~ s/1-ENST0000//g;
                $line=~ s/\s+//g;
                push (@array1, $line);
          #using splitarray because i want to store data as one character each
          #for ex: i wana store 'This' as T H I S in different elements of array
                @splitarray1= split ('',$line);
        last if ($line=~ /2-sampledata2/);
        }
}
foreach my $line(@body){
        if ($line=~ /^2-sampledata2\s/){
                $line=~ s/2-ENSBTAP0//g;
                $line=~ s/\s+//g;
                @splitarray2= split ('',$line);
        last if ($line=~ /3-sampledata3/);
        }
}

Como se puede ver que tengo diferentes matrices para cada sección y diferente para los bucles de cada sección. Si voy con el enfoque que tengo hasta ahora entonces voy a terminar con 50 para los bucles y 50 matrices.

¿Hay alguna otra forma mejor de hacer esto? Al final yo quiero terminar con 50 matrices, pero no quiero escribir 50 para los bucles. Y ya que comenzará a dar vueltas a través de las 50 matrices más adelante en el programa, tal vez para ser almacenados en una matriz? Soy nuevo a Perl por lo que su un poco abrumadora ...

¿Fue útil?

Solución

Lo primero a notar es que usted está tratando de utilizar nombres de variables con sufijos de números enteros: no. Utilizar una matriz cada vez que encontrar su auto querer hacer eso. En segundo lugar, sólo necesita leer para repasar el contenido del archivo una vez, no varias veces. En tercer lugar, por lo general hay ninguna buena razón en Perl para tratar una cadena como una matriz de caracteres.

Actualización: Esta versión del código utiliza existencia de espacios iniciales para decidir qué hacer. Me voy de la versión anterior para arriba también como referencia.

#!/usr/bin/perl

use strict;
use warnings;

my @data;

while ( my $line = <DATA> ) {
    chomp $line;
    if ( $line =~ s/^ +/ / ) {
        push @{ $data[-1] }, split //, $line;
    }
    else {
        push @data, [ split //, $line ];
    }
}

use Data::Dumper;
print Dumper \@data;

__DATA__
1-sampledata1 This is a sample test
              and data for this continues
2-sampledata2 This is sample test 2
              Data for this also is on second line

Versión anterior:

#!/usr/bin/perl

use strict;
use warnings;

my @data;

while ( my $line = <DATA> ) {
    chomp $line;
    $line =~ s/\s+/ /g;
    if ( $line =~ /^[0-9]+-/ ) {
        push @data, [ split //, $line ];
    }
    else {
        push @{ $data[-1] }, split //, $line;
    }
}

use Data::Dumper;
print Dumper \@data;

__DATA__
1-sampledata1 This is a sample test
              and data for this continues
2-sampledata2 This is sample test 2
              Data for this also is on second line

Otros consejos

#! /usr/bin/env perl
use strict;
use warnings;

my %data;
{
  my( $key, $rest );
  while( my $line = <> ){
    unless( ($rest) = $line =~ /^     \s+(.*)/x ){
      ($key, $rest) = $line =~ /^(.*?)\s+(.*)/;
    }
    push @{ $data{$key} }, $rest;
  }
}

El siguiente código es muy similar al @Brad Gilbert 's y @Sinan Unur ' soluciones s:

#!/usr/bin/perl
use strict;
use warnings;    
use Data::Dumper;

my (%arrays, $label);
while (my $line = <DATA>) 
{
    ($label, $line) = ($1, $2) if $line =~ /^(\S+)(.*)/; # new data block

    $line =~ s/^\s+//; # strip whitespaces from the begining
    # append data for corresponding label
    push @{$arrays{$label}}, split('', $line) if defined $label;
}

print $arrays{'1-sampledata1'}[2], "\n";     # 'i'
print join '-', @{$arrays{'2-sampledata2'}}; # 'T-h-i-s- -i-s- -s-a-m-p-l
print Dumper \%arrays;

__DATA__
1-sampledata1 This is a sample test
              and data for this continues
2-sampledata2 This is sample test 2
              Data for this also is on second line

salida

i
T-h-i-s- -i-s- -s-a-m-p-l-e- -t-e-s-t- -2-D-a-t-a- -f-o-r- -t-h-i-s- -a-l-s-o- -i-s- -o-n- -s-e-c-o-n-d- -l-i-n-e-
$VAR1 = {
          '2-sampledata2' => [
                               'T',
                               'h',
                               'i',
                               's',
                               ' ',
                               'i',
                               's',
                               ' ',
                               's',
                               'a',
                               'm',
                               'p',
                               'l',
                               'e',
                               ' ',
                               't',
                               'e',
                               's',
                               't',
                               ' ',
                               '2',
                               'D',
                               'a',
                               't',
                               'a',
                               ' ',
                               'f',
                               'o',
                               'r',
                               ' ',
                               't',
                               'h',
                               'i',
                               's',
                               ' ',
                               'a',
                               'l',
                               's',
                               'o',
                               ' ',
                               'i',
                               's',
                               ' ',
                               'o',
                               'n',
                               ' ',
                               's',
                               'e',
                               'c',
                               'o',
                               'n',
                               'd',
                               ' ',
                               'l',
                               'i',
                               'n',
                               'e',
                               '
'
                             ],
          '1-sampledata1' => [
                               'T',
                               'h',
                               'i',
                               's',
                               ' ',
                               'i',
                               's',
                               ' ',
                               'a',
                               ' ',
                               's',
                               'a',
                               'm',
                               'p',
                               'l',
                               'e',
                               ' ',
                               't',
                               'e',
                               's',
                               't',
                               'a',
                               'n',
                               'd',
                               ' ',
                               'd',
                               'a',
                               't',
                               'a',
                               ' ',
                               'f',
                               'o',
                               'r',
                               ' ',
                               't',
                               'h',
                               'i',
                               's',
                               ' ',
                               'c',
                               'o',
                               'n',
                               't',
                               'i',
                               'n',
                               'u',
                               'e',
                               's',
                               '
'
                             ]
        };

Debe, en cambio, utilizar un mapa hash para matrices.

Utilice este patrón de expresión para obtener el índice:

/^(\d+)-sampledata(\d+)/

Y entonces, con my %arrays, hacer:

push($arrays{$index}), $line;

A continuación, puede acceder a las matrices con $arrays{$index}.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top