2012-02-21 26 views
5

Tôi đang bối rối ví dụ sau:chênh lệch giữa vòng lặp while vs sử dụng duy nhất của nhà khai thác kim cương trong perl

<>; print; 

vs

while(<>){print;} 

Người đầu tiên không in bất cứ điều gì, nhưng một giây làm. Không <> luôn lưu trữ đầu vào được đọc vào $_?

Cảm ơn bạn.

+1

Thứ nhất là ngữ cảnh vô hướng, phải không? –

+0

@PaulTomblin: Vậy sao? –

+0

'$ a = <>; in $ a; 'in dòng đầu tiên. Vì vậy, tôi đoán '<>;' không cập nhật $ _. –

Trả lời

13

File kim cương đầu vào iterator là chỉ kỳ diệu khi nó đang ở trong điều kiện của một vòng lặp while:

$ perl -MO=Deparse -e '<>; print;' 
<ARGV>; 
print $_; 
-e syntax OK 

$ perl -MO=Deparse -e 'while (<>) {print;}' 
while (defined($_ = <ARGV>)) { 
    print $_; 
} 
-e syntax OK 

này được tất cả các tài liệu trong perlop

8

Nó không ngoại trừ điều kiện của tuyên bố while.

$ perl -MO=Deparse -e 'while(<>) { print }' 
while (defined($_ = <ARGV>)) { 
    print $_; 
} 
-e syntax OK 

$ perl -MO=Deparse -e '<>; print' 
<ARGV>; 
print $_; 
-e syntax OK 

perlop tài liệu mà tự động gán cho $_ chỉ xảy ra trong bối cảnh này:

Thông thường bạn phải gán giá trị trả về một biến, nhưng có là một tình huống mà một bài tập tự động xảy ra . Nếu và chỉ khi biểu tượng đầu vào là điều duy nhất bên trong điều kiện của câu lệnh "while" (ngay cả khi được cải trang thành vòng lặp "cho (;;)"), giá trị là được gán tự động cho biến toàn cầu $ _ , phá hủy bất cứ điều gì đã có trước đó. (Điều này có vẻ giống như một điều kỳ lạ đối với bạn, nhưng bạn sẽ sử dụng cấu trúc trong hầu hết mọi kịch bản Perl bạn viết.) Biến số $ _ không được bản địa hóa hoàn toàn. Bạn sẽ phải đặt một "địa phương $ _;" trước vòng lặp nếu bạn muốn điều đó xảy ra.

2

Từ http://perldoc.perl.org/perlvar.html (Nói về $ _) :

"Vị trí mặc định để đặt bản ghi đầu vào khi kết quả của hoạt động được kiểm tra bởi chính nó làm tiêu chí duy nhất của một thử nghiệm trong khi đó. cây bút."

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