2015-03-27 12 views
7

Nhìn vào tài liệu cho Reading Excel, có một tuyên bố tôi không thực sự hiểu.là gì || = trong perl cho?

Ai đó có thể giải thích những gì $sheet -> {MaxRow} ||= $sheet -> {MinRow}; không?

Tôi nhận được toán tử gán của nó. Tuy nhiên tôi không hiểu làm thế nào || có nghĩa là để làm việc?

Trả lời

12
$sheet -> {MaxRow} ||= $sheet -> {MinRow}; 

tương đương với:

$sheet -> {MaxRow} = ($sheet -> {MaxRow} || $sheet -> {MinRow}); 

Các địa phương OR đánh giá các toán hạng thứ hai chỉ khi là người đầu tiên là sai. Vì vậy, MaxRow sẽ nhận được giá trị của MinRow nếu MaxRow là 0 (có thể là lần lặp đầu tiên).

6

Toán tử ||= là logic-HOẶC chỉ định. Nó tương tự như +=, là bổ trợ. Nó tính toán OR hợp lý của LHS và RHS, và sau đó gán kết quả cho LHS, do đó phải là một giá trị hợp lệ.

Nói cách khác, cũng giống như

$a += 3; 

tương đương với

$a = $a+3; 

chúng ta có thể nói rằng

$a ||= 1; 

tương đương với

$a = $a||1; 

Bây giờ, liên quan đến tuyên bố mà bạn đã đề cập trong câu hỏi của bạn, có nhiều điều xảy ra ở đó hơn trong ví dụ trên. Trong tuyên bố của bạn, LHS không chỉ là một mã thông báo biến đơn giản, mà là một mã thông báo biến được coi là một tham chiếu băm ($sheet) và đang bị hủy tham chiếu để lấy giá trị được khóa bằng chuỗi 'MaxRow'. RHS cũng là một hoạt động dereference băm trên $sheet, nhưng khóa của nó là 'MinRow'. Nhưng hành vi là như nhau; chúng ta có thể nói rằng

$sheet->{'MaxRow'} ||= $sheet->{'MinRow'}; 

tương đương với

$sheet->{'MaxRow'} = $sheet->{'MaxRow'}||$sheet->{'MinRow'}; 

(Lưu ý: Tôi luôn luôn muốn một cách rõ ràng quote băm giá trị quan trọng như dây đàn, bởi vì đó là những gì họ đang có, nhưng không phải ai cũng đi cho rằng mức độ minh bạch.)

để biết thêm về các hoạt động logic OR, xem http://en.wikipedia.org/wiki/Logical_disjunction, và để biết Perl cụ thể, xem http://perldoc.perl.org/perlop.html#C-style-Logical-Or (ví ||//) và http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or (ví or). Trích dẫn có liên quan nhất, từ tài liệu Perl trên ||:

Nhị phân "||" thực hiện phép toán logic HOẶC mạch ngắn. Nghĩa là, nếu toán hạng bên trái là đúng, toán hạng bên phải thậm chí không được đánh giá. Ngữ cảnh vô hướng hoặc danh sách lan truyền xuống toán hạng bên phải nếu nó được đánh giá.

Điều đó không hoàn toàn giải thích được; trong trường hợp LHS đánh giá một giá trị trung thực (xem dưới đây để định nghĩa), thì giá trị trả về của hoạt động || là giá trị của LHS, nếu không thì đó là giá trị của RHS.

Trong Perl, giá trị logic thường được biểu thị bằng 0 (hoặc đôi khi '' hoặc undef) cho sai và 1 cho đúng.Tuy nhiên, để cụ thể hơn, bất kỳ giá trị nào không phải là một trong ba giá trị sai ở trên được coi là đúng và đôi khi các lập trình viên đề cập đến sự khác biệt này bằng cách sử dụng các thuật ngữ không chính thức "trung thực" và "giả". IOW, 0, ''undef là giả, và mọi thứ khác là trung thực. Xem http://www.perlmonks.org/?node=what%20is%20true%20and%20false%20in%20Perl%3F để biết thêm chi tiết.

+0

Có phiên bản nào đánh giá phía bên tay phải trước không? Tôi đang tìm một phím tắt có nghĩa là '$ a = $ b nếu $ b'. – felwithe

+0

@felwithe Nó phụ thuộc vào những gì bạn muốn xảy ra với '$ a' trong trường hợp RHS có điều kiện đánh giá sai. Nếu bạn muốn giữ lại giá trị hiện tại của '$ a', thì câu lệnh gán của bạn hoạt động như-is, vì toán tử' if' hoạt động như bạn đã viết, và sẽ ngăn việc gán diễn ra ở tất cả nếu điều kiện của nó có điều kiện là giả. Nếu bạn muốn một giá trị "mặc định" như 'undef', thì tôi nghĩ câu trả lời cho câu hỏi của bạn về mặt kỹ thuật là không, nhưng bạn có thể viết một chương trình con để làm điều đó:' sub if2 {return $ _ [1]? $ _ [0]: undef; } ', và sau đó gọi nó:' $ a = if2 $ b, $ b; '. – bgoldst

+0

Xin chào-- Ý tôi là giống như nó nói. Tôi chỉ nghĩ có thể có một lối tắt Perl tiện lợi mà tôi không biết. – felwithe