2011-09-09 31 views
15

ile ref değerini gösterirken, aşağıdaki Perl koduyla ilgili bir kılavuza ihtiyacım var. no strict 'refs''dan çıktığımda, sub düzgün çalışıyor. Bu satırlarda ölürPerl Sıkı ref

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

aşağıda"İşte" olarak işaretlenen: no strict 'refs' kaldırılırsa, o zaman şu hata mesajını alıyorum. Bu sub'un A..Z'deki tüm dosyaları açması (write>) olması ve READ dosyasından (LOG) regex'u temel alması gerekir, çıktı karşılık gelen dosya çıktısına yazılır.

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

cevap

8

$fh = $_'u atamayın, yararlı bir şey yapmıyor.

@FH%FH yerine push denemede olmalıdır:

$FH{ $_ } = $fh 

$FH{ $1 } ile $1 değiştirin.

+0

Bu hile yaptı. Ve 1 $ yazdı, {$ FH {$ 1}} yazdı. Teşekkürler. – Marcello

4

Bir dosya tanıtıcısından olarak değişmez bir dize kullanmaya çalışıyorsanız: En foreach döngü içinde, $_ vb değerler "A", "B", alır. Öyleyse yapma. Sadece yeni bir dosya sistemi yapın ve bunu @FH'a doğru itin.

6

Burada dosya tanıtıcısına adı olarak $ fh değerini kullanmak Perl soruyorsun:

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

yerine daha sonra, bir sözcük değişken kullanmak ve açık bir dosya tanıtıcısına içine autovivified o sahip düşünmelisiniz Daha sonra ona ulaşmak için bir karma bu depolamak: Daha sonra buradan kullanabilirsiniz

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

böylece:

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

Bu çalışır. Sadece $ 1 $ 'lık {{1}} tutamaçları yerine {$ handles {$ 1}} yazdı. Teşekkürler. – Marcello