2009-12-12 11 views
13

Zacząłem naprawdę lubić operatora C# 's ??. I jestem całkiem przyzwyczajony do tego, że tam, gdzie jest coś przydatnego w jakimś języku, to najprawdopodobniej też w Perlu.Czy istnieje odpowiednik Perla dla operatora koalescencji zerowej (??) w języku C#?

Jednak nie mogę znaleźć? odpowiednik w Perlu. Czy jest jakiś?

+10

Może to pomóc osobom zaznajomionym z Perlem, ale * nieznajomym * z C#, jeśli wyjaśnisz co ?? operatorzy to robią. – pavium

+1

@pavium: Oto link do dokumentacji MSDN na ?? operator: http://msdn.microsoft.com/en-us/library/ms173224.aspx –

+0

Aby wyjaśnić, co? oznacza "$ a ?? 5' to to samo, co '$ a! = Null? $ a: 5' co oznacza, że ​​jeśli $ a NIE ma wartości NULL, wynikiem wyrażenia jest $ a, w przeciwnym razie wynikiem jest 5. Jest to przydatne do sprawdzania wartości domyślnej, jeśli null, '$ a = $ a ?? 5'. – Despertar

Odpowiedz

30

Od 5.10 jest operator //, który jest semantycznie równoważne jeśli wziąć pod uwagę koncepcję undef w Perl być równoznaczne z pojęciem null w języku C#.

Przykład A:

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

Przykład B:

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

tak, automatycznie myślałem o undef jako odpowiedniku NULL dzięki –

+3

Idiom sprzed 5.10 jest po prostu zdefiniowany ($ a)? $ a: $ b', który wykonuje zadanie i czyta wystarczająco wyraźnie. – hobbs

+0

hobbs: tak, ale musiałbym napisać to 2 razy (co nie jest takie samo, kiedy jest na przykład wywołanie podprogramu) –

-4

Nie to, co wiem.

Perl nie jest tak naprawdę dużym użytkownikiem koncepcji zerowej. Ma test na to, czy zmienna jest niezdefiniowana. Brak specjalnego operatora, takiego jak? ale możesz użyć operatora warunkowego?: z testem undef i uzyskać całkiem blisko.

A także nie widzę niczego w perl operator list.

+0

cóż, nie odpowiedziałeś mi, ale dzięki stronie zdałem sobie sprawę, że moje pytanie jest trochę za mało i mogę po prostu użyć proste || (Przedstawiam to jako osobną odpowiedź) –

+0

nie. Właściwie to jestem w błędzie –

2

Faktycznie, zwarcie lub operator będzie również pracować przy ocenie undef:

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

Jednak nie powiedzie się przy ocenie 0, ale prawda:

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

Jak Adam says, Perl 5.10 ma operatora // że testuje swoje leworęczna operatora dla zdefiniowanej Ness zamiast prawdy:

use 5.010; 

my $value = $this // $that; 

Jeśli używasz starszej wersji Perl, jest to nieco niechlujny . || nie zadziała:

my $value = $this || $that; 

W takim przypadku, jeśli $this jest 0 lub pusty ciąg znaków, z których oba są zdefiniowane, dostaniesz $that. Aby obejść, że idiom jest użycie operatora warunkowego, dzięki czemu można tworzyć własne sprawdzenia:

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

Pytanie domniemanych dowolną liczbę argumentów, więc odpowiedź implikuje podprogram:

tu masz it - zwróci pierwszą zdefiniowaną/niepustą wartość z listy:

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

Myślę, że nie ma takiej potrzeby, używając' // 'wiele razy też powinno działać. – svick

Powiązane problemy