2010-01-30 40 views
33

Trong mã bên dưới, từ blog post by Alias, tôi nhận thấy việc sử dụng dấu chấm than đôi !!. Tôi đã tự hỏi nó có ý nghĩa gì và tôi có thể đi đâu trong tương lai để tìm lời giải thích cho cú pháp Perl như thế này. (Có, tôi đã tìm kiếm !! tại số perlsyn).Làm gì !! (dấu chấm than đôi) có nghĩa là gì?

package Foo; 

use vars qw{$DEBUG}; 
BEGIN { 
    $DEBUG = 0 unless defined $DEBUG; 
} 
use constant DEBUG => !! $DEBUG; 

sub foo { 
    debug('In sub foo') if DEBUG; 

    ... 
} 

CẬP NHẬT
Cảm ơn tất cả các câu trả lời của bạn.

Đây là cái gì khác tôi chỉ thấy rằng có liên quan The List Squash Operator x!!

+4

Nếu bạn nghĩ '!!' là một toán tử thú vị, hãy thử toán tử '->' trong vòng lặp for. :) – Ether

+0

Ether, bạn có thể gửi liên kết tới toán tử -> không? Tôi không biết làm thế nào để tìm thấy nó trên google. – Geo

+0

@Geo: ở đây bạn đi (bạn sẽ cười, đừng ghét tôi): http://stackoverflow.com/questions/1642028/what-is-the-name-of-this-operator – Ether

Trả lời

47

Nó chỉ là hai ! các toán tử boolean không nằm cạnh nhau.

Lý do sử dụng thành ngữ này là để đảm bảo rằng bạn nhận được 1 hoặc 0. Trên thực tế nó trả về một chuỗi rỗng mà numifys đến 0. Nó thường chỉ được sử dụng trong số, hoặc bối cảnh boolean mặc dù.

Bạn thường sẽ thấy điều này trong Code Golf cuộc thi, bởi vì nó ngắn hơn bằng cách sử dụng ? : hành ternary với 10 ($test ? 1 : 0).

!! undef == 0 
!! 0  == 0 
!! 1  == 1 
!! $obj   == 1 
!! 100 == 1 

undef ? 1 : 0 == 0 
0  ? 1 : 0 == 0 
1  ? 1 : 0 == 1 
$obj ? 1 : 0 == 1 
100 ? 1 : 0 == 1 
+9

Tôi thực sự thường sử dụng '!!!!' trong mã của mình, vì '!!' làm cho cú pháp của cú pháp của vim trở nên nổi bật và một '!!' khác sẽ khôi phục nó! – Ether

+26

@Ether: * Rõ ràng *, bạn cần sử dụng các emacs. :) –

+10

Nó tạo 1 hoặc giá trị false chuẩn, không phải 0. Đây là 0 trong ngữ cảnh số nhưng chuỗi trống trong ngữ cảnh chuỗi. Để có được 0 hoặc 1, sử dụng toán tử '1-!' :) – ysth

12

không-không.

Chuyển đổi giá trị thành giá trị boolean (hoặc gần bằng Perl được như vậy).

+4

Nó cũng là một thành ngữ phổ biến trong các ngôn ngữ khác cũng giống như Javascript. – mpeters

+0

@David Dorward Cảm ơn câu trả lời của bạn! –

-1

Bởi vì ba câu trả lời khác cho rằng phạm vi là "0" hoặc "1", tôi chỉ nghĩ rằng tôi muốn đề cập rằng các phép toán luận trong Perl (như trả về bởi các nhà khai thác như ==, not, và vân vân) là undef1, không phải 01.

+3

Điều này không đúng. Khi một toán tử phải tạo ra một giá trị sai, nó sử dụng một giá trị ma thuật đánh giá là chuỗi rỗng trong ngữ cảnh chuỗi hoặc 0 trong ngữ cảnh số. (Các ngoại lệ là các toán tử như 'và' và' hoặc', mà đơn giản trả về toán hạng khiến chúng trả về false.) (Xem http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood) – cjm

+2

undef cũng là một giá trị ma thuật đánh giá là '' trong ngữ cảnh chuỗi và 0 trong ngữ cảnh số - khác biệt duy nhất là khi cảnh báo được kích hoạt, sử dụng undef cho chuỗi hoặc giá trị số của nó là apt để tạo ra một cảnh báo, trong khi 'giá trị sai' không có điều đó;) – hobbs

+2

@hobbs: Vâng, một sự khác biệt là 'định nghĩa (undef)' là sai , nhưng 'đã xác định (1 == 2)' là đúng. – cjm

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