Skip to content
Find file
Fetching contributors…
Cannot retrieve contributors at this time
279 lines (194 sloc) 6.94 KB
0:00:01.533,0:00:08.533
Hola, en esta parte mostraré cómo
comparar valores escalares con Perl.
0:00:08.533,0:00:13.667
Quiero saber si 1, 1.0 y 1.00
0:00:13.667,0:00:16.000
son iguales, mayores o menores entre sí.
0:00:16.000,0:00:21.333
¿Y qué acerca de 1.00 como una cadena entre comillas?
0:00:21.333,0:00:27.283
¿O tal vez los comparar las cadenas "foo" y "bar"?
0:00:27.283,0:00:29.283
Perl tiene-
0:00:29.283,0:00:34.282
Vimos que Perl tiene operadores, como "+" y ".", que convierten
0:00:34.282,0:00:39.282
cadenas a números y viceversa dependiendo del contexto.
0:00:39.282,0:00:44.282
Y no les importa el valor que contenga la variable.
0:00:44.282,0:00:46.351
Ocurre algo similar con los operadores.
0:00:46.351,0:00:50.258
De hecho, Perl tiene dos tipos de operadores de comparación.
0:00:50.258,0:01:00.239
En este archivo tengo una tabla que muestra los operadores de
comparaciones numéricas y de cadenas.
0:01:00.239,0:01:04.076
Igual igual comprobará que los dos lados sean iguales como números.
0:01:04.076,0:01:07.333
Y eq comprobará si son iguales como cadenas.
0:01:07.333,0:01:13.439
Y esto comprobaría que no sean iguales; esto comprobaría
que el lado izquierdo es menor como número.
0:01:13.439,0:01:16.936
Y lt (less than) los compararía como cadenas.
0:01:16.936,0:01:20.498
Veamos cómo funciona.
0:01:20.498,0:01:22.398
Aquí hay un ejemplo.
0:01:22.398,0:01:28.878
Comparemos 12 con 12.0.
0:01:28.878,0:01:37.008
Y si es verdadero, imprimiremos TRUE.
0:01:37.008,0:01:43.997
Si no, FALSE.
0:01:43.997,0:01:49.208
Si ejecuto este código será verdadero
porque 12 es igual a 12.0.
0:01:49.208,0:01:54.200
Y Perl ignora el punto 0 porque incluso aunque lo haya escrito
en notación de punto flotante
0:01:54.200,0:01:59.200
sigue teniendo 12 como valor real.
0:01:59.200,0:02:04.856
Lo mismo ocurriría si pusiera dos 0, pero no
importa mucho porque seguiría siendo verdadero.
0:02:04.856,0:02:09.945
Y si pongo esto entre comillas seguiría siendo verdadero
0:02:09.945,0:02:14.945
porque Perl compara la cadena con el número, y obtiene lo mismo.
0:02:14.945,0:02:19.467
Ahora, si los comparo usando eq, me dice que es
0:02:19.467,0:02:25.467
falso, porque ahora Perl convierte el número en una cadena.
0:02:25.467,0:02:31.892
Así que tienes 12 del lado izquierdo
12.00 del lado derecho.
0:02:31.892,0:02:34.926
Dos cadenas que no son iguales.
0:02:34.926,0:02:37.872
¿Cómo se comparan los números?
0:02:37.872,0:02:41.609
¿Cuál es mayor y cuál es menor?
0:02:41.609,0:02:43.963
Comparemos dos con tres.
0:02:43.963,0:02:48.706
Obviamente, dos es menor que tres, y
me dice que es verdadero.
0:02:48.706,0:02:50.825
Dos es menor que tres.
0:02:50.825,0:02:54.217
¿Y si los comparo como cadenas?
0:02:54.217,0:02:55.757
Ocurre lo mismo, es dos.
0:02:55.757,0:03:01.759
Es verdadero porque el dos está antes del tres en la tabla
ascii.
0:03:01.759,0:03:08.000
¿Y qué sucede cuando comparo doce con tres?
0:03:08.000,0:03:10.267
Es bastante obvio.
0:03:10.267,0:03:13.333
Es verdadero porque doce es mayor a tres.
0:03:13.333,0:03:17.538
¿Pero qué sucede si comparo con gt (greater than), como cadena?
0:03:17.538,0:03:20.015
Al ejecutarlo dice que es falso.
0:03:20.015,0:03:24.221
Puede parecer un poco sorprendente, pero cuando lo piensas,
0:03:24.221,0:03:28.221
la manera en la que gt funciona
0:03:28.221,0:03:32.221
es que toma el primer caracter, que es uno,
0:03:32.221,0:03:37.221
y lo compara con el primer otro caracter, que es 3.
0:03:37.221,0:03:40.069
Y con este caracter sabemos que el lado izquierdo
0:03:40.069,0:03:44.069
se encuentra antes del lado derecho en la tabla ascii.
0:03:44.069,0:03:55.968
El punto es que decidirá si doce como una cadena es menor a tres,
regresando falso.
0:03:55.968,0:04:02.139
Veamos qué pasa al comparar "foo" y "bar"
0:04:02.139,0:04:06.215
Comprobaré si son iguales con el doble signo de igual.
0:04:06.215,0:04:11.523
Y al ejecutarlo, sorprendentemente dice TRUE.
0:04:11.523,0:04:16.864
Tal vez sea un poco menos alentador para quienes saben qué significa
eso.
0:04:16.864,0:04:20.006
"==" compara los dos lados como números.
0:04:20.006,0:04:24.008
Y los convierte a números, y esa es la razón por la que funcionan las alertas.
0:04:24.008,0:04:28.133
Porque el signo "==" espera dos números.
0:04:28.133,0:04:34.267
Hay dos cadenas que no tienen números
exactos, por lo que Perl me alerta.
0:04:34.267,0:04:41.133
Y convierte ambos lados a 0 para evitar convertir del lado izquierdo, buscando números.
0:04:41.133,0:04:47.013
No hay números en ningún lado, por lo que ambos
valen 0.
0:04:47.013,0:04:54.933
Y por lo tanto, 0 es igual a 0 como dos números,
esta es la razón por la que Perl imprime que es cierto.
0:04:54.933,0:05:04.018
Obviamente, si sabes que tienes que comparar dos cosas que pueden ser cadenas,
entonces tu probablemente usarías eq.
0:05:04.018,0:05:12.016
De hecho, en la mayoría de los lugares del mundo, probablemente
usaste "eq" cuando comparaste 2 cadenas.
0:05:12.016,0:05:17.002
En este caso, obviamente tenemos falso, como lo esperaba.
0:05:17.002,0:05:23.869
Algo que pudiese ser más interesante: que si comparas con una cadena vacía
tengo el mismo problema.
0:05:23.869,0:05:26.554
Me dice que es verdadero, y dos advertencias.
0:05:26.554,0:05:32.012
Sólo quiero recordarte que me llegan esos
avisos porque yo pedí que lo hicieran.
0:05:32.012,0:05:41.996
Es bastante importante usar ese pragma, o sino siempre tendría errores.
0:05:41.996,0:05:49.948
Obviamente, si estoy usando "eq", pueden haber falsos positivos.
0:05:49.948,0:05:53.975
Veamos ejemplos de dónde pueden ocurrir estos problemas.
0:05:53.975,0:06:08.806
Digamos que está tu nombre, y que estás haciendo una
pregunta, que se debe contestar con la terminal.
0:06:08.806,0:06:23.384
Después le quito el salto de renglón al final y veo si name es igual a 0.
0:06:23.384,0:06:30.762
Y ese es un problema bastante común, algunas personas no conocen
la diferencia entre eq y ==.
0:06:30.762,0:06:36.719
Si aquí escribo cualquier cadena, me llegan
todas estas advertencias, pero ya da verdadero.
0:06:36.719,0:06:41.635
Aunque estabas comprobando todo, olvidaste comprobar la cadena vacía.
0:06:41.635,0:06:48.664
Y da verdadero porque esta cadena, "ddd", desde el
lado izquierdo hay 0.
0:06:48.664,0:06:50.926
Igual igual convierte la variable en número.
0:06:50.926,0:06:53.005
El lado derecho es un número.
0:06:53.005,0:06:57.950
Los dos lados son iguales.
0:06:57.950,0:07:05.006
La forma correcta de hacerlo sería comprobar si esta cadena
con eq es sólo una cadena vacía.
0:07:05.006,0:07:09.999
Entonces puedo ejecutar este código y colocar 'ddd' y eso es falso.
0:07:09.999,0:07:19.850
Por otra parte, si ejecuto este script y oprimo enter sin escribir
nada, es verdadero porque ahora el resultado es una cadena vacía.
0:07:19.850,0:07:22.000
Y eso es todo acerca de la comparación de valores.
0:07:22.000,0:07:25.000
Gracias por ver el video, y nos vemos la próxima.
Jump to Line
Something went wrong with that request. Please try again.