2012-01-10 34 views
15

Tôi đang làm việc trên một phiên bản mới của một mã số đã phát hành của perl, và tìm thấy dòng:

$|++; 

AFAIK, $ | có liên quan với các đường ống, như được giải thích in this link và tôi hiểu điều này, nhưng tôi không thể tìm ra cái ++ (cộng thêm) có nghĩa là ở đây.

Cảm ơn bạn trước.

EDIT: Tìm thấy câu trả lờiin this link:

Nói tóm lại: Nó buộc in (tuôn) để giao diện điều khiển của bạn trước khi báo cáo kết quả tiếp theo, trong trường hợp kịch bản là quá nhanh.

Đôi khi, nếu bạn đặt lệnh in trong vòng lặp chạy rất nhanh, bạn sẽ không thấy đầu ra của bản in cho đến khi chương trình kết thúc. đôi khi, bạn thậm chí không thấy kết quả đầu ra. giải pháp cho vấn đề này là "xả" bộ đệm đầu ra sau mỗi câu lệnh in; điều này có thể được thực hiện trong perl với lệnh sau đây:

$|++; 

[cập nhật] như đã được chỉ ra bởi r. schwartz, tôi đã nhầm lẫn; lệnh trên gây ra in để xóa bộ đệm trước đầu ra tiếp theo.

Trả lời

18

$| mặc định là 0; làm $|++ do đó tăng nó lên 1. Đặt nó thành nonzero cho phép tự động quét trên xử lý tệp hiện được chọn, theo mặc định là STDOUT và hiếm khi được thay đổi.

Vì vậy, hiệu quả là đảm bảo rằng các tuyên bố print và kết quả tương tự ngay lập tức. Điều này rất hữu ích nếu bạn xuất ra một ổ cắm hoặc tương tự.

+0

Re "*' $ | ++ 'do đó tăng nó lên 1. *", Không hoàn toàn. '$ | ++' đặt nó thành '1', bất kể giá trị của nó trước đây là bao nhiêu. Đó là "lối tắt" cho '$ | = 1; ' – ikegami

3

Tăng dần tự động, điều này có thể tương đương với việc bật tính năng này.

+2

Tôi nghĩ rằng bạn có thể được đùa về gói xung quanh để không, nhưng điều thú vị là '$ |' là một boolean, hãy thử '$ | = 3; in $ | '. –

+0

'$ |' chỉ có thể nhận các giá trị 0 và 1, vì vậy nó không thể quấn quanh. Tuy nhiên, ['- $ |' không "quấn quanh"] (http://stackoverflow.com/questions/4959230/), và có thể được sử dụng để chuyển đổi '$ |' (thay vì, giả sử, '$ | = 1- $ | 'hoặc' $ | =! $ | '). – mob

+0

Không, tôi đã không đùa, tôi đã sai, giả sử đó là một con số. Cảm ơn bạn đã sửa, tôi sẽ chỉnh sửa phần bao quanh. –

11

$| là tên viết tắt của $OUTPUT_AUTOFLUSH, như bạn đã tìm thấy. Biến số ++ tăng biến này.

$| = 1 sẽ là cách sạch sẽ để thực hiện việc này (IMHO).

+0

Tôi đồng ý rằng '$ | = 1; 'là rõ ràng hơn. Sau khi tất cả, nó không giống như '$ | -;' tắt autoflushing. (Nó chuyển đổi nó.) '$ | ++;' là một tối ưu hóa vi mô ngu xuẩn. (Bạn có thực sự cần 10 nano giây đó xấu không?) – ikegami

+1

@ikegami, tại sao bạn nghĩ đọc giá trị, tăng nó và đặt nó trở lại là 10 nano giây nhanh hơn chỉ đơn giản là đặt 1 trong? Tôi nghĩ rằng nó chỉ là tác giả tìm thấy mã này tốt hơn tìm kiếm và ông được quyền có nhận thức của mình về vẻ đẹp. –

+0

@Michael Krelin - hacker, Incrementing thường không liên quan đến việc "đưa trở lại", nhưng vì đây là một biến phép thuật, có một số sự thật cho điều đó. Vì vậy, bạn đã đúng; nó có thể là một tối ưu hóa ngu ngốc hơn mà tôi đã nhận ra trước đó vì nó thực sự có thể làm chậm mọi thứ. – ikegami

3

Đó là một thành ngữ cũ, từ những ngày trước IO :: Xử lý. Trong mã hiện đại này nên được viết như

use IO::Handle; STDOUT->autoflush(1);

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