2011-09-09 22 views
15

Necesito ayuda con el siguiente código de Perl. Cuando salgo de no strict 'refs', el sub funciona bien. Pero si se retira la no strict 'refs', entonces me sale el mensaje de error:Perl No se puede usar una cadena como símbolo ref mientras que la referencia estricta

Can't use string ("A") as a symbol ref while "strict refs" in use at test.pl 

Se muere en las líneas marcadas como "Aquí" a continuación. Este sub necesita abrir (escribir>) todos los archivos desde A..Z y en base al regex desde el archivo READ (LOG) la salida se escribirá en la salida del archivo correspondiente.

use strict; 
use Text::CSV_XS; 
no strict 'refs'; 
... 
... 
sub file_split { 

    my ($i, $fh, @FH); 
    my ($file) = @_; 
    my (@alpha) = ("A".."Z"); 

    for (@alpha) {        
      $fh = $_ ; 
      open ($fh,">","$_-$file") || die $!;  <--------- HERE 
      push @FH, $fh; 
    } 

    my $csv = Text::CSV_XS->new({ binary => 1, 
            allow_whitespace => 1, 
            allow_loose_escapes => 1, 
            allow_loose_quotes =>1, 
            escape_char => undef , 
            sep_char => ',', 
            auto_diag=> 1 
            }); 
    open(LOG,"<", $file) || die $!; 
    while (my $row = $csv->getline(*LOG)) { 
      if ($row->[0] =~ /^(\w)/) { 
        print $1      <--------- HERE 
          "$row->[0]".",". 
          "$row->[1]" .",". 
          "$row->[2]" .",". 
          "$row->[3]" .",". 
          "$row->[4]".",". 
          "$row->[5]"."\n"; 

      } else { 
         print "Record skipped... --> $row->[0] <-- ... please verify  \n"; 
       } 
    } 
} 

Respuesta

8

No asignar $fh = $_ no está haciendo nada útil.

@FH debe ser %FH y en lugar de la push intento:

$FH{ $_ } = $fh 

Vuelva a colocar la $1 con $FH{ $1 }.

+0

Eso hizo el truco. Y se imprimió $ 1 para imprimir {$ FH {$ 1}}. Gracias. – Marcello

4

Usted está tratando de utilizar una cadena literal como un gestor de archivo: en su bucle foreach, $_ toma los valores "A", "B", etc. Entonces, no hagas eso. Simplemente crea un nuevo identificador de archivo y presiona eso en @FH.

6

Estás preguntando Perl para utilizar el valor de $ FH como el nombre del gestor de archivo aquí:

for (@alpha) {        
      $fh = $_ ; 
      open ($fh,">","$_-$file") || die $!;  <--------- HERE 
      push @FH, $fh; 
    } 

su lugar, debe considerar el uso de una variable léxica y tener que autovivified en un gestor de archivo mediante procedimiento abierto, a continuación, almacenar esto en un hash para llegar a ella más tarde:

for (@alpha) {        
      open (my $fh,">","$_-$file") || die $!; 
      $handles{$_} = $fh; 
} 

para que pueda usarlo más tarde aquí:

while (my $row = $csv->getline(*LOG)) { 
      if ($row->[0] =~ /^(\w)/) { 
        print $handles{$1}      <--------- HERE 
          ... 
+0

Esto funciona. Solo se deben reemplazar los $ impresores $ {$ 1} para imprimir {$ identificadores {$ 1}}. Gracias. – Marcello

Cuestiones relacionadas