2009-12-12 29 views
13

Tôi bắt đầu thực sự thích nhà điều hành ?? của C#. Và tôi khá quen với thực tế, rằng ở đó có thứ gì đó tiện dụng trong một số ngôn ngữ, nó có lẽ cũng có trong Perl.Có tương đương Perl với toán tử kết hợp null (??) trong C# không?

Tuy nhiên, tôi không thể tìm thấy ?? tương đương trong Perl. Có cái gì không?

+10

Nó có thể giúp những người quen thuộc với Perl, nhưng * không quen thuộc với C#, nếu bạn giải thích cái gì ?? điều hành. – pavium

+1

@pavium: Đây là liên kết đến tài liệu MSDN trên ?? nhà điều hành: http://msdn.microsoft.com/en-us/library/ms173224.aspx –

+0

Để làm rõ những gì ?? có nghĩa là, '$ a ?? 5' giống với '$ a! = Null? $ a: 5' có nghĩa là nếu $ a là NOT NULL thì kết quả của biểu thức là $ a, nếu không kết quả là 5. Nó xác minh hữu ích cho việc mặc định thành giá trị nếu null, '$ a = $ a ?? 5'. – Despertar

Trả lời

30

Từ 5.10 có toán tử //, tương đương ngữ nghĩa nếu bạn xem khái niệm undef trong Perl tương đương với khái niệm null trong C#.

Ví dụ A:

my $a = undef; 
my $b = $a // 5; # $b = 5; 

Ví dụ B:

my $a = 0; 
my $b = $a // 5; # $b = 0; 
+0

có, tôi tự động nghĩ về undef là tương đương với NULL cảm ơn –

+3

Thành ngữ trước 5.10 chỉ là 'được xác định ($ a)? $ a: $ b', công việc và đọc đủ rõ ràng. – hobbs

+0

hobbs: vâng, nhưng tôi sẽ phải viết nó 2 lần (không giống nhau, ví dụ, một cuộc gọi đến chương trình con) –

-4

Không phải là tôi biết.

Perl không thực sự là một người dùng lớn của khái niệm rỗng. Nó có một thử nghiệm cho dù một biến là không xác định. Không có nhà điều hành đặc biệt như ?? Mặc dù vậy, nhưng bạn có thể sử dụng toán tử điều kiện ?: với một thử nghiệm undef và nhận được khá gần.

Và tôi cũng không thấy bất kỳ điều gì trong perl operator list.

+0

tốt, bạn đã không trả lời tôi, nhưng nhờ vào trang tôi nhận ra câu hỏi của tôi là một chút đi và tôi chỉ có thể sử dụng đơn giản || (Tôi đặt nó như là một câu trả lời riêng) –

+0

không. Tôi thực sự sai –

2

Trên thực tế, ngắn mạch OR cũng sẽ làm việc khi đánh giá undef:

my $b = undef || 5; # $b = 5; 

Tuy nhiên, nó sẽ thất bại khi đánh giá 0 nhưng đúng:

my $b = 0 || 5; # $b = 5; 
6

Như Adam says, Perl 5.10 có các nhà điều hành // rằng kiểm tra khai thác bên trái của nó đối với định nghĩa-Ness thay vì sự thật:

use 5.010; 

my $value = $this // $that; 

Nếu bạn đang sử dụng một phiên bản cũ của Perl, đó là một chút lộn xộn . Các || sẽ không làm việc:

my $value = $this || $that; 

Trong trường hợp đó, nếu $this là 0 hoặc chuỗi rỗng, cả hai đều được xác định, bạn sẽ nhận được $that. Để khắc phục điều đó, thành ngữ là sử dụng các nhà điều hành có điều kiện, do đó bạn có thể làm kiểm tra của riêng bạn:

my $value = defined($this) ? $this : $that; 
0

Câu hỏi ngụ ý bất kỳ số lượng các đối số, vì vậy câu trả lời ngụ ý một chương trình con:

Ở đây bạn sẽ có được nó - sẽ trả lại giá trị được xác định/không trống đầu tiên của một danh sách:

sub coalesce { (grep {length} @_)[0] } 
+0

Tôi nghĩ rằng không có nhu cầu này, bằng cách sử dụng' // 'nhiều lần nên làm việc quá. – svick

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