2011-09-09 11 views
15

पर स्ट्रिंग का उपयोग नहीं कर सकता है जबकि मुझे निम्नलिखित पर्ल कोड के साथ कुछ मार्गदर्शन चाहिए। जब मैं no strict 'refs' छोड़ देता हूं, तो sub ठीक काम करता है।पर्ल सख्त रेफरी

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

यह लाइनों में मर जाता है के रूप में "यहाँ" नीचे चिह्नित: लेकिन अगर no strict 'refs' निकाल दिया जाता है, तो मैं त्रुटि संदेश मिलता है। यह sub को A..Z से सभी फ़ाइलों को खोलने (लिखने>) की आवश्यकता है और रीड फ़ाइल (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

आप एक स्ट्रिंग एक filehandle के रूप में शाब्दिक उपयोग करने के लिए कोशिश कर रहे हैं: अपने foreach पाश में, $_ मूल्यों "A", "B", आदि पर ले जाता है। तो, ऐसा मत करो। बस एक नया फाइलहेडल बनाएं और इसे @FH पर दबाएं।

6

आप filehandle का नाम यहां के रूप में $ एफ एच के मूल्य का उपयोग करने के लिए पर्ल पूछ रहे हैं:

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

आप इसके बजाय किसी शाब्दिक चर का उपयोग कर और जो खुले द्वारा एक filehandle में 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

यह काम करता है। प्रिंट $ हैंडल {$ 1} को {$ हैंडल {$ 1}} प्रिंट करने के लिए प्रतिस्थापित किया जाना था। धन्यवाद। – Marcello

संबंधित मुद्दे