2012-10-16 28 views
41

Tôi đang gọi nhiều kịch bản Perl trong kịch bản Bash của tôi (đôi khi từ csh).Làm cách nào để kiểm tra xem tập lệnh Perl không có bất kỳ lỗi biên dịch nào?

Khi bắt đầu tập lệnh Bash, tôi muốn đặt một kiểm tra kiểm tra xem tất cả các tập lệnh Perl có không có bất kỳ lỗi biên dịch nào hay không. Một cách để thực hiện điều này là thực sự gọi kịch bản Perl từ tập lệnh Bash và grep cho "lỗi biên dịch" trong tệp nhật ký đường ống, nhưng điều này trở nên lộn xộn như các kịch bản Perl khác nhau được gọi tại các điểm khác nhau trong mã , vì vậy tôi muốn làm điều này ngay từ đầu kịch bản Bash.

Có cách nào để kiểm tra xem tập lệnh Perl có lỗi biên dịch không?

Trả lời

59

Hãy coi chừng !!

Sử dụng lệnh bên dưới để kiểm tra lỗi biên dịch trong chương trình Perl của bạn có thể nguy hiểm.

$ perl -c yourperlprogram 

Randal đã viết một bài viết rất đẹp về chủ đề này mà bạn nên kiểm tra

Trích dẫn từ bài viết của mình :

Có lẽ là si điều mplest chúng ta có thể nói là "nó có hợp lệ không?". Đối với điều này, chúng tôi gọi perl chính nó, đi qua công tắc biên dịch chỉ:

perl -c ourprogram 

Đối với hoạt động này, perl biên dịch chương trình, nhưng dừng lại chỉ ngắn của giai đoạn thực hiện. Điều này có nghĩa là mọi phần của văn bản chương trình được dịch sang cấu trúc nội bộ cấu trúc đại diện cho chương trình làm việc, nhưng chúng tôi chưa thực sự thực hiện bất kỳ mã nào. Nếu có bất kỳ lỗi cú pháp nào, chúng tôi sẽ được thông báo và hủy bỏ biên dịch.

Thực ra, đó là một chút nói dối. Nhờ khối BEGIN (bao gồm người anh em họ trên lớp của họ, chỉ thị sử dụng), một số mã Perl có thể có được thực hiện trong quá trình kiểm tra cú pháp "an toàn về mặt lý thuyết" này. Đối với Ví dụ, nếu mã của bạn có chứa:

BEGIN { warn "Hello, world!\n" } 

sau đó bạn sẽ thấy thông báo rằng, ngay cả trong perl -c! Điều này hơi ngạc nhiên đối với những người xem xét "chỉ biên dịch" có nghĩa là "thực thi không có mã". Xem xét các mã có chứa:

BEGIN { system "rm", "-rf", "/" } 

và bạn sẽ thấy vấn đề với lập luận đó. Rất tiếc.

+0

Cảm ơn bạn đã cho biết các giới hạn của phương pháp. Btw, làm thế nào tôi nên ống đầu ra perl -c? 'perl -c script.pl | grep "cú pháp OK" 'không hoạt động như dự định. Tôi hy vọng nó sẽ không trả lại gì khi nó chứa các lỗi biên dịch. – user13107

+1

Nevermind, hiểu rồi! Cú pháp 'perl -c script.pl | & grep" OK "' – user13107

+0

Tốt hơn nên kiểm tra giá trị thoát thực tế, thay vì grep cho một số đầu ra chuỗi. Giá trị thoát sẽ là 0 nếu thành công, không đồng bộ nếu nó không kiểm tra. –

-1

Khi bạn cần phải kiểm tra lỗi/cảnh báo trước khi chạy nhưng tập tin của bạn phụ thuộc trên mutliple các tệp khác bạn có thể thêm tùy chọn -I:

perl -I /path/to/dependency/lib -c /path/to/file/to/check 

Sửa: từ người perlrun

Thư mục theo quy định của -Tôi được thêm vào phía trước đường dẫn tìm kiếm cho module (@ INC).

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