Tôi biết bạn có thể sử dụng toán tử kiểm tra tệp -B để kiểm tra xem tệp có phải là nhị phân hay không, nhưng Perl thực hiện nội bộ này như thế nào?Perl biết một tệp là nhị phân như thế nào?
16
A
Trả lời
26
Từ perldoc -f -B
:
Các-T
và-B
tắc làm việc như sau. Khối đầu tiên hoặc do đó tệp được kiểm tra đối với các ký tự lẻ chẳng hạn như mã kiểm soát hoặc ký tự lạ với bộ bit cao. Nếu quá nhiều ký tự lạ (> 30%) được tìm thấy, đó là tệp-B
; nếu không, đó là tệp-T
. Ngoài ra, bất kỳ tệp nào chứa null trong khối đầu tiên được coi là tệp nhị phân. Nếu-T
hoặc-B
được sử dụng trên filehandle, bộ đệm IO hiện tại được kiểm tra thay vì khối đầu tiên. Cả hai-T
và-B
trả về true trên một tệp rỗng hoặc tệp tạiEOF
khi thử nghiệm tệp thủ công. Vì bạn phải đọc một tệp để làm bài kiểm tra-T
, trên hầu hết các trường hợp bạn muốn sử dụng số-f
đối với tệp trước, như trong "next unless -f $file && -T $file
".
10
Theo Chương 11 của cuốn sách Learning Perl:
Câu trả lời là ** Perl lừa **: nó mở tập tin, nhìn vào đầu tiên vài ngàn byte, và làm cho một giáo dục đoán . Nếu nó thấy rất nhiều byte null, các ký tự điều khiển bất thường và các byte có bộ bit cao, thì nó trông giống như một tệp nhị phân. Nếu không có nhiều thứ lạ, thì nó trông giống như văn bản. Đôi khi nó đoán sai. Nếu một tệp văn bản có nhiều từ tiếng Thụy Điển hoặc tiếng Pháp (có thể có các ký tự đại diện với bộ bit cao, như một số biến thể ISO-8859 hoặc thậm chí là phiên bản Unicode), nó có thể đánh lừa Perl khai báo nhị phân. Vì vậy, nó không hoàn hảo, nhưng nếu bạn cần tách mã nguồn của bạn khỏi các tệp đã biên dịch hoặc các tệp HTML khỏi PNG, các thử nghiệm này sẽ thực hiện thủ thuật.
Các vấn đề liên quan
- 1. Tại sao Perl không biên dịch thành các tệp nhị phân như python
- 2. Ruby xử lý byte/nhị phân như thế nào?
- 3. Tôi nên lưu tệp như thế nào trong OpenOffice để nó không phải là tệp nhị phân trong Subversion?
- 4. Perl & MongoDB dữ liệu nhị phân
- 5. Tôi nên phân phối tệp dữ liệu với mô-đun Perl như thế nào?
- 6. tìm kiếm nhị phân trong một mảng trong Perl
- 7. Tạo một tệp nhị phân ngẫu nhiên
- 8. Đọc một tệp nhị phân với python
- 9. Phân tích tệp nhị phân trong Ruby
- 10. Deserialize một phần của tệp nhị phân
- 11. Tôi nên sử dụng Tệp Perl :: Temp như thế nào?
- 12. Caching một tệp nhị phân trong C#
- 13. thay thế sed nhị phân
- 14. Java, Runtime.exec hoặc ProcessBuilder: làm thế nào để biết nếu tập tin là vỏ hoặc nhị phân?
- 15. svn diff: tệp được đánh dấu là loại nhị phân
- 16. RESTful tạo tệp nhị phân
- 17. Hoạt động nhị phân trên tệp nhị phân Erlang?
- 18. Ký tự null nhị phân là gì?
- 19. Đọc/Viết Tệp nhị phân
- 20. Làm thế nào bạn có thể đảo ngược thiết kế một tệp tiết kiệm nhị phân?
- 21. Làm thế nào gửi arraybuffer như nhị phân thông qua Websocket?
- 22. \ x00 có nghĩa là gì trong tệp nhị phân?
- 23. Python: cắt một tệp nhị phân rất lớn
- 24. Git SVN với các tệp nhị phân
- 25. Tháo một tệp nhị phân phẳng Sử dụng objdump
- 26. Trình cài đặt nhị phân Linux (.bin, .sh) hoạt động như thế nào?
- 27. Đọc một tệp nhị phân thành một mảng
- 28. Khác nhau cho 3 tệp nhị phân
- 29. Đọc và mã hóa base64 một tệp nhị phân
- 30. Gửi tệp nhị phân trong Tornado
Có cơ hội sử dụng ký tự bộ nhớ cache ma thuật "_": "tiếp theo trừ khi -f $ tệp và -T _" –