2011-09-09 8 views
15

Potrzebuję wskazówek z następującego kodu Perl. Kiedy opuszczam no strict 'refs', sub działa dobrze. Ale jeśli no strict 'refs' jest usuwany, a następnie pojawia się komunikat o błędzie:Perl Nie można użyć ciągu jako symbolu ref, podczas gdy ścisłe odniesienia

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

ona umiera w liniach oznaczonych jako „Tutaj” poniżej. Ten sub musi otworzyć (napisać>) wszystkie pliki od A..Z i na podstawie regex z pliku READ (LOG) dane wyjściowe zostaną zapisane do wyjścia pliku korespondencyjnego.

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"; 
       } 
    } 
} 

Odpowiedz

8

Nie przypisuj $fh = $_ nic nie robi.

@FH powinny być %FH i zamiast spróbować push:

$FH{ $_ } = $fh 

Wymień $1 z $FH{ $1 }.

+0

To wystarczyło. Wydrukuj 1 USD zostało zastąpione, aby wydrukować {$ FH {$ 1}}. Dzięki. – Marcello

4

Próbujesz użyć ciągu literalnego jako uchwytu pliku: W pętli foreach, $_ przybiera wartości "A", "B" itp. Więc nie rób tego. Po prostu utwórz nową rękojeść i wciśnij ją na @FH.

6

Prosisz perla aby użyć wartości $ fh jako nazwa uchwytu pliku tutaj:

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

Należy zamiast rozważyć użycie zmiennej leksykalne i posiadające że autovivified do uchwytu pliku przez Open, a następnie przechowywać w ten hash dostać na nią później:

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

tak, że można go używać w dalszej części:

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

To działa. Wystarczy, że print $ handle {$ 1} musiał zostać zastąpiony, aby wydrukować {$ handles {$ 1}}. Dzięki. – Marcello

Powiązane problemy