2012-12-19 28 views
8

Tôi cần phải đọc từ một tệp, lặp qua nó và viết dòng đó vào tệp khác. Khi số lượng các dòng đạt đến ngưỡng, hãy đóng chốt xử lý tệp đầu ra và mở một tệp mới.Trong Perl, cách tránh mở các tệp nhiều lần

Làm cách nào để tránh mở và đóng trình xử lý tệp đầu ra mỗi khi tôi đọc một dòng từ xử lý tệp đầu vào như dưới đây?

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

Không mở và đóng tệp của bạn trong vòng lặp. Di chuyển lệnh 'open' trên vòng lặp for. –

Trả lời

11

Chỉ mở lại tệp khi bạn thay đổi $postfix. Ngoài ra, bạn có thể đơn giản hơn một chút.

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 nhưng tôi nghĩ bạn chỉ nên giữ phần thứ hai của câu trả lời. –

+0

Và bạn có thể thêm ở dưới cùng: 'if (tell ($ fop)! = -1) {close $ fop; } 'để đóng nó. –

+4

Bạn nên luôn kiểm tra lỗi khi mở tệp. Trừ khi, tất nhiên, bạn đang sử dụng module 'autodie'. Bạn là ai. :) – TLP

Các vấn đề liên quan