2012-09-25 11 views
13

Durante il processo di test del mio codice Perl usando "Smart Match (~~)" ho affrontato questo problema. Ci sarà qualche differenza tra 42, 42.0, "42,0", "42"Ci saranno differenze tra 42, 42.0, "42.0", "42"

$var1 = "42"; 
$var2 = "42.0"; 
$a = $var1 ~~ $var2; 

sto ottenendo $a come 0; che significa $var1 e $var2 non sono uguali.

Spiegare per favore.

+1

No, sono tutti LA risposta. ;) –

risposta

26

L'operatore di smart match "di solito fa quello che vuoi". Si prega di leggere questo come "non sempre".

42 ~~ 42.0 restituisce true.

42 ~~ "42.0" restituisce true pure: la stringa viene confrontata con un numero e quindi vista come un numero. Idem per "42" ~~ 42.0.

"42" ~~ "42.0" restituisce false: entrambi gli argomenti sono stringhe e queste stringhe non vengono confrontate come "uguali", sebbene il loro significato numerico lo farebbe. Non vorrai che Perl visualizzi "two" ~~ "two-point-oh" come vero.

Una stringa può essere forzato alla sua interpretazione numerico aggiungendo lo zero:

0+"42" ~~ "42.0" restituisce true nuovo, come la prima stringa è costretto al numero 42, e la seconda segue tuta.

Il perldoc perlsyn o perldoc perlop page definisce come funziona Smart Matching:

 Object Any  invokes ~~ overloading on $object, or falls back: 
     Any  Num  numeric equality   $a == $b 
     Num  numish[4] numeric equality   $a == $b 
     undef Any  undefined    !defined($b) 
     Any  Any  string equality   $a eq $b 

Si può vedere che l'uguaglianza stringa è il valore predefinito.

2

Digitazione contestuale.

e $Var2 sono stati utilizzati per l'ultima volta come stringhe (nel compito) quindi ora si comportano come stringhe. ~~ eseguirà il confronto delle stringhe se entrambi gli argomenti sono stringhe.

Se si utilizza uno di loro come un numero - non è nemmeno necessario assegnare ad essa - allora si comporterà come un numero e ~~ userà un confronto numerico.

Questo script emette NO YES:

my $v1 = "42"; 
my $v2 = "42.0"; 
print (($v1 ~~ $v2) ? 'YES ' : 'NO '); 

$v1 + 0; 
print (($v1 ~~ $v2) ? 'YES ' : 'NO '); 

Reference for ~~ operator

8

Si potrebbe voler riconsiderare utilizzando smart partita per ora. L'attuale implementazione è considerata dalla comunità Perl un errore, tra l'altro a causa della tua domanda e della risposta di amon.

Il lavoro è in corso per una versione "più sana" e più semplice, ma incompatibile, della corrispondenza intelligente che potrebbe trovarsi nella prossima versione principale di Perl (5.18). Semplicemente fuorilegge il tuo esempio: $ a ~~ $ b non sarà permesso quando $ b è un semplice valore scalare (come 42 o "42").

Se si ha troppo tempo a disposizione, è possibile esaminare gli archivi Perl5 porters, ad esempio this thread.

Problemi correlati