2011-09-09 68 views
15

我需要一些指導以及下面的Perl代碼。當我離開no strict 'refs'時,sub正常工作。但是,如果no strict 'refs'被刪除,然後我得到的錯誤信息:Perl不能使用字符串作爲符號ref,而嚴格參考

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

它死在了線標記爲「在這裏」的。此sub需要打開(寫入>)A..Z中的所有文件,並根據READ文件(LOG)中的regex將輸出寫入相應的文件輸出。

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

回答

8

不要分配$fh = $_它沒有做任何有用的事情。

@FH應該%FH代替push嘗試和:

$FH{ $_ } = $fh 

$FH{ $1 }更換$1

+0

這個技巧。並且打印$ 1被替換爲打印{$ FH {$ 1}}。謝謝。 – Marcello

4

您正在嘗試使用一個字符串文字作爲文件句柄:在你的foreach循環,$_取值爲"A""B"等。所以,不要這樣做。只要創建一個新的文件句柄並將其推入@FH

6

你問的Perl使用的$跳頻值作爲文件句柄的名字在這裏:

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

而是應該考慮使用一個詞法變量並具有autovivified成打開一個文件句柄,然後這些信息存儲在一個哈希在後來得到:

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

,以便以後可以在這裏使用它:

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

這工作。只需要將打印$ handles {$ 1}替換爲打印{$ handles {$ 1}}即可。謝謝。 – Marcello

相關問題