2012-12-19 16 views
8

मुझे फ़ाइल से पढ़ने की जरूरत है, इसके माध्यम से पुनरावृत्ति करें और दूसरी फ़ाइल में लाइन लिखें। जब लाइनों की संख्या थ्रेसहोल्ड तक पहुंच जाती है, तो आउटपुट फ़ाइल हैंडल बंद करें और एक नया खोलें।पर्ल में, फ़ाइलों को कई बार खोलने से कैसे बचें

जब भी मैं नीचे इनपुट फ़ाइल हैंडल से एक पंक्ति पढ़ता हूं, तो मैं आउटपुट फ़ाइल हैंडल को खोलने और बंद करने से कैसे बचूं?

use autodie qw(:all); 

my $tot  = 0; 
my $postfix = 'A'; 
my $threshold = 100; 

open my $fip, '<', 'input.txt'; 
LINE: while (my $line = <$fip>) { 
    my $tot += substr($line, 10, 5);  
    open my $fop, '>>', 'output_' . $postfix; 
    if ($tot < $threshold) { 
     print {$fop} $line; 
    } 
    else { 
     $tot = 0; 
     $postfix++; 
     redo LINE; 
    } 
    close $fop; 
} 
close $fip; 
+3

लूप के अंदर अपनी फ़ाइल को खोलें और बंद न करें। लूप के ऊपर 'ओपन' कमांड को ले जाएं। –

उत्तर

11

जब आप $postfix बदलते हैं तो फ़ाइल को फिर से खोलें। इसके अलावा, आप थोड़ा सा सरल हो सकते हैं।

use warnings; 
use strict; 
use autodie qw(:all); 

my $tot  = 0; 
my $postfix = 'A'; 
my $threshold = 100; 

open my $fop, '>>', 'output_' . $postfix; 
open my $fip, '<', 'input.txt'; 
while (my $line = <$fip>) { 
    $tot += substr($line, 10, 5);  

    if ($tot >= $threshold) { 
     $tot = 0; 
     $postfix++; 
     close $fop; 
     open $fop, '>>', 'output_' . $postfix; 
    } 
    print {$fop} $line; 
} 
close $fip; 
close $fop; 
+2

+1 लेकिन मुझे लगता है कि आपको केवल अपने उत्तर का दूसरा भाग रखना चाहिए। –

+0

और आप नीचे जोड़ सकते हैं: 'अगर (बताएं ($ fop)! = -1) {करीब $ fop; } इसे बंद करने के लिए। –

+4

जब आप फ़ाइलों को खोलते हैं तो आपको हमेशा त्रुटि जांचनी चाहिए। बेशक, आप 'autodie' मॉड्यूल का उपयोग कर रहे हैं। आप कौन हैं :) – TLP

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