2012-09-08 22 views
6

Tôi tương đối mới để Perl và đang làm việc trên các tập tin Perl được viết bởi một người khác, và tôi tiếp tục gặp phải những tuyên bố sau vào lúc bắt đầu của kịch bản:chuỗi eval dài tại beginnning của Perl script

eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"[email protected]"}' && eval 'exec perl -w -S $0 $argv:q' 
    if 0; 

Hai dòng này làm gì? Kiểm tra mã là gì? và Câu if 0; làm gì?

Trả lời

8

Đây là một biến thể của lệnh hack. Trong những ngày trước khi thông dịch viên có thể được xác định một cách đáng tin cậy với một số #!, điều này đã được sử dụng để làm cho shell exec perl. Các if 0 trên dòng thứ hai là không bao giờ đọc bởi vỏ, mà đọc dòng đầu tiên chỉ và exec perl, mà đọc if 0 và không tái thực hiện chính nó.

Đây là một biến thể thú vị, nhưng tôi nghĩ không hoàn toàn chính xác. Dường như nó được thiết lập để làm việc với shell bourne hoặc với các biến thể csh, sử dụng eval ban đầu để xác định shell đang phân tích nó và sau đó sử dụng cú pháp thích hợp để chuyển các đối số tới perl. Mệnh đề ở giữa là cú pháp sh và mệnh đề cuối cùng là thích hợp cho csh. Nếu số && thứ hai là ||eval '(exit $?0)' ban đầu đã thực sự thất bại trong csh, thì điều này sẽ hoàn thành các mục tiêu đó, nhưng như được viết, tôi không nghĩ rằng nó hoàn toàn phù hợp với csh. Có một lệnh mà trước đó sẽ thiết lập $? cho một số giá trị dựa trên vỏ? Nhưng ngay cả khi đó là trường hợp và $? được đặt thành giá trị khác 0 thì không có gì sẽ được thực hiện trừ khi && được thay thế bằng ||. Một cái gì đó buồn cười đang xảy ra.

+0

Cảm ơn! 'Exec hack' là gì? Bạn có nghĩa là một 'shebang'? –

+0

Lệnh hack về cơ bản là bất kỳ kỹ thuật nào sử dụng lệnh exec để gọi một trình thông dịch cụ thể thay vì sử dụng một dòng shebang. –

+0

Cảm ơn! những gì sẽ là tương đương 'shebang' dòng sau đó? Bằng cách nào đó kiểm tra 'eval' này trông phức tạp hơn là chỉ yêu cầu sử dụng một trình thông dịch/nhị phân cụ thể. –

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