2011-09-09 8 views
15

以下のPerlコードに関するガイダンスが必要です。 no strict 'refs'を終了すると、subが問題なく動作します。それはラインで死ぬPerl厳密な参照中に文字列をシンボルrefとして使用できません

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

は以下「ここ」としてマークさ:no strict 'refs'が削除された場合でも、私はエラーメッセージが表示されます。この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

あなたがここにファイルハンドルの名前として$ FHの値を使用するようにPerlを求めている:

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

あなたは代わりに、その後、字句変数を使用して、オープンでファイルハンドルに自動活性化ということを検討する必要があり後でそれを取得するにはハッシュでこれを保存:あなたは後でそれをここで使用することができます

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}}を印刷するには、print $ handles {$ 1}を置き換えなければなりませんでした。ありがとう。 – Marcello