2010-10-11 20 views
11

Tôi có kịch bản sau đây:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $count = 0; 
my (@first , @second , @third); 

while ($count <= 7){ 

    push (@first , $count); 
    push (@second , $count) if defined $count; 
    push (@third , $count) if $count; 
    $count++; 

} 

print "first: @first\n"; 
print "second: @second\n"; 
print "third: @third\n"; 

này tạo ra kết quả như sau:

first: 0 1 2 3 4 5 6 7 
second: 0 1 2 3 4 5 6 7 
third: 1 2 3 4 5 6 7 

sự khác biệt giữa việc đưa if defined $count vs if $count, khác so với phương pháp thứ hai sẽ không thêm số không vào là gì mảng? Tôi đã tìm kiếm các perldocs nhưng không thể tìm thấy câu trả lời.

Trả lời

25

Truth and Falsehood in perlsyn giải thích những gì giá trị được coi là sai trong một bối cảnh boolean:

Số 0, chuỗi '0''', danh sách rỗng (), và undef là tất cả các sai lầm trong một bối cảnh boolean. Tất cả các giá trị khác đều đúng.

undef là giá trị của biến chưa bao giờ được khởi tạo (hoặc đã được đặt lại bằng cách sử dụng undef function). defined function trả về true nếu giá trị của biểu thức không phải là undef.

if $count là false nếu $count là số 0, chuỗi '0', chuỗi rỗng, undef, hoặc một đối tượng mà đã được overloaded trở về một trong những điều khi được sử dụng trong một bối cảnh boolean. Nếu không, đó là sự thật. (Danh sách trống không thể được lưu trữ trong biến vô hướng.)

if defined $count chỉ là sai nếu $countundef.

-1

Cách tôi đọc.

if $count chỉ đúng khi $count đánh giá != 0, do đó mảng thứ ba không có 0 trong đó.

if defined $count kiểm tra xem liệu $count là vô hướng đã được tạo chưa và bạn có $count vô hướng không, giống như số đầu tiên.

+3

phải là: "khi $ count ước tính! = 0" –

+0

@nathan. Chúc mừng –

+0

Cả hai đều làm việc theo cùng một cách, thực sự. Đó là giá trị mà họ kiểm tra đó là khác nhau. Đầu tiên kiểm tra giá trị của $ count, giá trị thứ hai của giá trị được xác định là $ count. if() không quan tâm đến cách bạn nhận được giá trị. –

2

Kiểm tra biến vị ngữ defined để xem liệu biến ($count trong trường hợp này) có được xác định hay không. Trong đoạn mã bạn đã viết, nó luôn luôn được định nghĩa bên trong vòng lặp vì nó luôn có giá trị.

Nếu bạn đã thêm:

undef $count; 
push (@first , 'undef'); 
push (@second , 'undef') if defined $count; 
push (@third , 'undef') if $count; 

sau khi vòng lặp, bạn sẽ thấy sự khác biệt. (Lưu ý rằng tôi đã thay đổi mã để thêm đen 'undef' thay vì $count vì bạn sẽ nhận được hiệu ứng sai lệch từ việc thêm giá trị thực tế undef.

+0

Có thể chính xác hơn một chút để nói rằng hàm được định nghĩa() trả về true hoặc false và rằng if() kiểm tra giá trị đó. Định nghĩa() thực hiện điều tương tự có hoặc không có điều kiện. –

5

nếu bạn thấy tài liệu của defined trong perldoc sau đó bạn sẽ thấy rằng

  • Trả về một giá trị Boolean nói liệu EXPR có một giá trị khác hơn undef giá trị không xác định. Nếu EXPR không có mặt, $ _ là kiểm tra.

  • Một thử nghiệm đơn giản Boolean sẽ không phân biệt giữa undef, zero, chuỗi rỗng và "0", tất cả đều là đều sai false.

đó có nghĩa là,

push (@second , 'undef') if defined $count; 

khi $count = 0, sau đó nó được định nghĩa bởi vì 0 là khác nhau từ undefđịnh nghĩa trả về true, nhưng trong trường hợp này push (@third , 'undef') if $count;if condition thất bại, đó là lý do tại sao nó không phải là đẩy 0 vào mảng.

3

Các if quyết định chạy khối của nó (hoặc tuyên bố duy nhất) bằng cách nhìn vào giá trị của biểu thức bạn cho nó:

if(EXPR) { ... } 

Nếu biểu hiện đó là sự thật, nó chạy khối của nó. Nếu biểu thức đó là sai, nó không.

Biểu thức đó có thể là bất kỳ thứ gì. Perl đánh giá biểu thức, giảm nó thành giá trị đúng hoặc sai. Sau đó, if() sẽ xem xét giá trị đó.

Vì vậy, xóa phần đó trong câu hỏi của bạn, bạn còn lại với "Sự khác biệt giữa defined $count$count" là gì. Vâng, một là giá trị trả lại cho defined và giá trị khác là bất kỳ giá trị nào được lưu trữ trong $count.

Khi bạn muốn tìm ra một bit cụ thể của mã đang làm, hãy giảm nó trong cùng một quy trình lôgic mà perl sẽ thực hiện, mỗi lần một bước. Xem từng bước thực hiện và bạn thường có thể trả lời các câu hỏi của riêng mình. :)

Bạn nói rằng bạn đã tìm kiếm tài liệu, nhưng tôi không chắc chắn nơi bạn đã xem. Nếu bạn muốn tìm kiếm một chức năng built-in, bạn có thể sử dụng -f switch perldoc của:

$ perldoc -f defined 

Nếu bạn muốn đọc về cú pháp Perl cho những thứ như if, đó là trong perlsyn.

Tôi có hướng dẫn cho người mới bắt đầu về tài liệu Perl trong Perl documentation documentation.

0

Như bất kỳ nút fule nào, "Số 0, các chuỗi '0' và '', danh sách trống() và undef" không được cân bằng thành false bởi vì chúng không có tính chất boolean. Viết mã dựa trên sự hư hỏng này, trong khi kỹ thuật chính xác, là gây hiểu lầm và nên được khuyến khích mạnh mẽ. Như nên cỏ dại và sissies.

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