2009-12-12 15 views
13

Ho iniziato ad apprezzare l'operatore ?? del C#. E sono abbastanza abituato al fatto, che dove c'è qualcosa di utile in una lingua, è probabilmente anche in Perl.Esiste un Perl equivalente all'operatore null coalescente (??) in C#?

Tuttavia, non riesco a trovare ?? equivalente in Perl. C'è qualche?

+10

potrebbe aiutare chi ha familiarità con il Perl, ma * * familiarità con C#, se si spiega ciò che l'?? gli operatori lo fanno. – pavium

+1

@pavium: Ecco un collegamento alla documentazione MSDN sul ?? operatore: http://msdn.microsoft.com/en-us/library/ms173224.aspx –

+0

Per chiarire cosa ?? significa, $ a ?? 5' è uguale a '$ a! = Null? $ a: 5' che significa che se $ a NON è NULL il risultato dell'espressione è $ a, altrimenti il ​​risultato è 5. È utile verificare l'impostazione predefinita di un valore se null, '$ a = $ a ?? 5'. – Despertar

risposta

30

Al 5.10 c'è l'operatore //, che è semanticamente equivalente se si considera il concetto di undef in Perl per essere equivalente alla nozione di null in C#.

Esempio A:

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

Esempio B:

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

sì, ho pensato automaticamente di undef come equivalente di NULL grazie –

+3

L'idioma pre-5.10 è appena 'definito ($ a)? $ a: $ b', che fa il lavoro e legge abbastanza chiaramente. – hobbs

+0

hobbs: sì, ma dovrei scriverlo 2 volte (che non è lo stesso, quando è, ad esempio, una chiamata a subroutine) –

-4

Non che io sappia.

Perl non è realmente un grande utente del concetto nullo. Ha un test per stabilire se una variabile non è definita. Nessun operatore speciale come il ?? però, ma puoi usare l'operatore condizionale?: con un test undef e avvicinarti abbastanza.

E non vedo nulla nel perl operator list neanche.

+0

beh, non mi hai risposto, ma grazie alla pagina mi sono reso conto che la mia domanda era un po 'off e posso usare semplicemente || (L'ho messo come risposta separata) –

+0

no. In realtà ho torto –

2

In realtà, il corto-circuito OR operatore funziona anche undef nella valutazione:

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

Tuttavia, fallirà quando si valuta 0 ma vero:

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

Come Adam says, Perl 5.10 ha l'operatore // che mette alla prova il suo operatore di sinistra per definire-ness al posto della verità:

use 5.010; 

my $value = $this // $that; 

Se si utilizza una versione precedente di Perl, è un po 'confuso . Il || non funzionerà:

my $value = $this || $that; 

In tal caso, se $this è 0 o una stringa vuota, entrambi i quali sono definiti, si otterrà $that. Per aggirare questo, il linguaggio è quello di utilizzare l'operatore condizionale in modo da poter rendere il proprio controllo:

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

La domanda implicita qualsiasi numero di argomenti, quindi la risposta implica una subroutine:

Qui si ottiene esso - restituirà il primo valore definito/non vuoto stringa di una lista:

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

Penso che non ce ne sia bisogno, usando' // 'più volte dovrebbe funzionare anche. – svick

Problemi correlati