2012-07-09 23 views
8

Tôi có tệp sử dụng CR/LF để tách các bản ghi, nhưng các bản ghi riêng lẻ đôi khi chứa LF.Vấn đề phân cách đường dây Perl mới

while (<$in>) 
{ 
    #extract record data 
} 

Tôi đang cố gắng đọc mã này như trên và điều này (như tôi mong đợi) sẽ chia tách các bản ghi chỉ chứa LF. Tuy nhiên tôi đã mong đợi rằng một sự phân công lại $/ sẽ giải quyết vấn đề này nhưng nó dường như gây ra các tập tin hoàn chỉnh cho tôi đọc trong một lần lặp.

$/ = "\r\n"; 
while (<$in>) 
{ 
    #extract record data 
} 

Bất kỳ ai ở đây có thể đề xuất giải pháp làm việc?

Tôi đang sử dụng Activestate Perl trên Windows.

Trả lời

3

thử loại này trước khi

binmode($in); 
4

Thử đặt $/ thành "\n". Từ Newlines in perlport:

Perl sử dụng \n để đại diện cho "logic" xuống dòng, nơi những gì là logic thể phụ thuộc vào nền tảng được sử dụng. Trong MacPerl, \n luôn có nghĩa là \015. Trong perls DOS, \n thường có nghĩa là \012, nhưng khi truy cập tệp ở chế độ "văn bản", perl sử dụng lớp :crlf chuyển nó sang (hoặc từ) \015\012, tùy thuộc vào việc bạn đang đọc hay viết.

10

Trên cửa sổ, perl chuyển đổi kết thúc dòng CRLF đến để TĐT chỉ, làm cho một sự phân biệt giữa CRLF và LF không thể bằng cách đọc trong các dữ liệu dưới dạng văn bản (perlport). Vì vậy, bạn cần phải đọc dữ liệu của bạn trong chế độ nhị phân sử dụng binmode trên của bạn tập tin xử lý:

binmode($in); 

Sau đó, bạn có thể thiết lập các phân tích đầu vào "\ 015 \ 012" và đọc trong hồ sơ của bạn như thông thường:

$/ = "\015\012"; 
while (<$in>) { 
    ... 
} 

Greets, Matthias

PS: tôi không có cơ hội để kiểm tra rằng tại địa phương, vào lúc này, vì vậy tôi lấy làm tiếc nếu nó không hoạt động.

+0

Cảm ơn bạn đã làm việc hoàn hảo! – Hans

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