2011-11-10 33 views
6

Tôi có mã lặp qua các dòng trong một tệp và cố gắng in ra từng dòng có thêm thứ gì đó ở đầu và cuối.Đầu ra Perl tự ghi đè

Tuy nhiên, tôi nhận được kết quả như sau: "bò danh nghĩa".

Về cơ bản, bit sau dòng (danh nghĩa) sẽ ghi đè đầu của nó. Tôi biết rằng việc loại bỏ các dòng chomp và regex dừng hiệu ứng này, nhưng tôi cần nó nằm trên một dòng không có dấu cách. Tôi làm sai ở đâu?

while ($line = <INPUT>) { 

     chomp $line; 
     $line =~ s/ //g; 
     printf "\@attribute %s nominal\n", $line; 
} 
+3

Các yếu tố của '@ attribute' là gì? –

+1

Xin lỗi, đã bỏ lỡ thẻ thoát, nó có nghĩa là văn bản thuần túy (\ @att ...) – blitzen

Trả lời

10

Tệp đầu vào của bạn có thể từ MS Windows có dòng cuối được mã hóa là CR-LF. Bạn cũng có thể chỉ cần s/\r// để xóa CR.

+1

Tuyệt vời! Đó là chính xác những gì đã đi sai, tôi sẽ nhớ rằng trong tương lai :) (Tôi đã sử dụng $ line = ~ s/\ r // g; trong giải pháp của tôi). Chúc mừng! – blitzen

6

Bạn có thể có \r trong biến của mình. Hãy thử sử dụng \s:

$line =~ s/\s//g; 

Xem perlre cho ý nghĩa của \s.

+0

Tôi nghĩ rằng câu trả lời SO nên được khép kín. Tại sao không chỉ giải thích ý nghĩa của '\ s' cùng với liên kết để biết thêm thông tin? – Sparky

+0

tại sao dải của bạn thoát ra khỏi tất cả khoảng trắng để loại bỏ '\ r' (vận chuyển trả về)? '$ Line = ~ s/\ r // g'; Điều đó nói rằng, câu trả lời của choroba có lẽ là nguyên nhân gốc rễ (cùng một giải pháp) –

+1

Tuyệt vời! Đó là chính xác những gì đã đi sai, tôi sẽ nhớ rằng trong tương lai :) (Tôi đã sử dụng $ line = ~ s/\ r // g; trong giải pháp của tôi). Chúc mừng! – blitzen

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