Line directives (#line) được sử dụng để định cấu hình lại ý tưởng của perl về tên tệp và số dòng hiện tại. Khi nào điều này được yêu cầu để có được tên tập tin và số dòng (trong một thông báo lỗi)?Mục đích của chỉ thị #line của perl là gì?
Trả lời
Thường thì các điểm đánh dấu như vậy được đưa vào mã đã được xử lý trước hoặc được tạo bằng máy móc để tham khảo lại nguồn do con người tạo ra.
Ví dụ, nếu có một chương trình chuyển đổi Python để Perl, nó có thể chèn một
# line 812 "foo.py"
để thông báo lỗi sẽ tham khảo các mã Python ban đầu sẽ có ý nghĩa hơn đối với các lập trình viên.
Chúng hữu ích khi gói một tập lệnh Perl trong một tệp khác, như pl2bat. Perl không nhìn thấy các lệnh batch ở đầu của tập tin mà ném ra ý tưởng của nó về số dòng. Chỉ thị #line
khi bắt đầu nguồn Perl sẽ bù đắp cho điều này.
Ngoài các lý do đã đề cập perl
có tùy chọn -P
(được khuyến khích mạnh mẽ) chạy tệp Perl thông qua bộ tiền xử lý C trước khi thực thi. Vì hầu hết các bộ tiền xử lý của C sẽ sử dụng các chỉ thị dòng khi chúng bao gồm hoặc loại bỏ một phần của một tệp nên mọi lỗi sẽ được báo cáo từ nơi chúng được đặt trong nguồn ban đầu thay vì nguồn được xử lý.
Chỉ thị dòng cũng có thể rất hữu ích nếu bạn đang tạo mã bằng các chuỗi sau đó được chuyển đến eval
. Thông thường nếu có một cảnh báo hoặc lỗi trong mã như vậy bạn nhận được một báo cáo lỗi như "chết tại (eval 1) dòng 1." Sử dụng chỉ thị dòng, bạn có thể cung cấp tên tệp và số dòng hữu ích.
Tôi đã nhìn thấy nhiều lần mọi người viết sai số hiện tại của dòng vào chỉ thị #line. Mã này phải chứa số tiếp theo của dòng. mã ví dụ của linetest.pl (sử dụng một wrapper ksh để thiết lập một biến môi trường cho các kịch bản perl):
1 #!/usr/bin/ksh
2 MY_ENV_VAR='something'
3 export MY_ENV_VAR
4 /usr/bin/perl -x $0 [email protected] 2>&1
5 exit $?
6
7 #!/usr/bin/perl
8 #line 9
9 print "MY_ENV_VAR is $ENV{MY_ENV_VAR}\n";
10 die "This is line 10.";
Chạy kịch bản và kiểm tra kết quả:
$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.
Bạn có thể thấy rằng số dòng phù hợp sau khi viết #line 9
trên dòng 8.
- 1. Mục đích của thư mục buildSrc của gradle là gì?
- 2. Mục đích của `__metaclass__ = type` là gì?
- 3. Mục đích của UIWindow là gì?
- 4. Mục đích của HttpHeaders.TryAddWithoutValidation là gì?
- 5. Mục đích của tệp .edmx là gì?
- 6. Mục đích của lớp Expression là gì?
- 7. Mục đích của character_set_connection là gì?
- 8. Mục đích của 'var' là gì?
- 9. Mục đích của phiên JMS là gì?
- 10. Mục đích của config.assets.precompile là gì?
- 11. Mục đích của nguyên mẫu là gì?
- 12. Mục đích của is_uploaded_file() là gì?
- 13. Mục đích của tệp vshost.exe là gì?
- 14. Mục đích của Parse Vexing là gì?
- 15. Mục đích của Array.GetLowerBound (int) là gì?
- 16. Mục đích của tệp pdb là gì?
- 17. Mục đích của String.IsInterned là gì?
- 18. Mục đích của ldexp là gì?
- 19. Mục đích của IntentSender là gì?
- 20. Mục đích của Rake là gì?
- 21. Mục đích của layout.xml là gì?
- 22. Mục đích của requestWindowFeature() là gì?
- 23. mục đích của Thread.holdsLock (khóa) là gì?
- 24. Mục đích của __cxa_pure_virtual là gì?
- 25. Mục đích của startManagingCursor là gì?
- 26. Mục đích của thuộc tính-đích là gì?
- 27. JAF là gì? Mục đích của nó là gì?
- 28. Tệp xcscheme là gì? Mục đích của nó là gì?
- 29. Mục đích của phương thức Expression.Quote của LINQ là gì?
- 30. Mục đích của Lazyamazy_from_val của OCaml là gì?
+1. Không bao giờ biết tính năng này tồn tại. – friedo