Operadores
## Objetivos de Aprendizaje
- Dominar los operadores aritmeticos
- Comprender los operadores de cadena
- Aprender operadores de comparacion
- Trabajar con operadores logicos
- Comprender operadores bitwise y de archivo
## Operadores Aritmeticos
### Operaciones Basicas
```perl
use strict;
use warnings;
my $a = 10;
my $b = 3;
print $a + $b; # 13 (suma)
print $a - $b; # 7 (resta)
print $a * $b; # 30 (multiplicacion)
print $a / $b; # 3.333... (division)
print $a % $b; # 1 (modulo)
print $a ** $b; # 1000 (10^3, exponenciacion)
```
### Comportamiento de la Division
```perl
# La division siempre produce punto flotante
print 10 / 3; # 3.33333333333333
# Division entera
print int(10 / 3); # 3 (trunca)
print POSIX::floor(10 / 3); # 3 (piso)
```
### Incremento/Decremento
```perl
my $x = 5;
# Pre-incremento
print ++$x; # 6 (incrementa primero, retorna 6)
# Post-incremento
print $x++; # 6 (retorna 6, luego incrementa)
print $x; # 7
my $y = 5;
print --$y; # 4
print $y--; # 4
print $y; # 3
```
## Operadores de Cadena
### Concatenacion
```perl
my $primero = "Hola";
my $ultimo = "Mundo";
my $saludo = $primero . " " . $ultimo; # "Hola Mundo"
# Asignacion por concatenacion
my $str = "Hola";
$str .= " Mundo"; # "Hola Mundo"
```
### Repeticion
```perl
my $guion = "-" x 40; # 40 guiones
my $patron = "AB" x 3; # "ABABAB"
# Util para formateo
print "+" . ("-" x 10) . "+\n";
# +----------+
```
## Operadores de Comparacion
### Comparacion Numerica
```perl
my $a = 10;
my $b = 20;
print $a == $b; # falso (0)
print $a != $b; # verdadero (1)
print $a < $b; # verdadero (1)
print $a > $b; # falso (0)
print $a <= $b; # verdadero (1)
print $a >= $b; # falso (0)
print $a <=> $b; # -1 (nave especial: -1, 0, o 1)
```
### Comparacion de Cadenas
```perl
my $a = "manzana";
my $b = "banana";
print $a eq $b; # falso ("")
print $a ne $b; # verdadero ("banana" ne "manzana")
print $a lt $b; # verdadero ("manzana" lt "banana")
print $a gt $b; # falso
print $a le $b; # verdadero
print $a ge $b; # falso
print $a cmp $b; # -1 (cmp retorna -1, 0, o 1)
```
### Tabla de Comparacion
| Numerico | Cadena | Significado |
|----------|--------|-------------|
| `==` | `eq` | Igual |
| `!=` | `ne` | No igual |
| `<` | `lt` | Menor que |
| `>` | `gt` | Mayor que |
| `<=` | `le` | Menor o igual |
| `>=` | `ge` | Mayor o igual |
| `<=>` | `cmp` | Nave especial/comparar |
## Operadores Logicos
### Logica Basica
```perl
my $verdadero = 1;
my $falso = 0;
print $verdadero && $falso; # falso (0) - AND
print $verdadero || $falso; # verdadero (1) - OR
print !$verdadero; # falso (0) - NOT
```
### Sintaxis Alternativa
```perl
print $verdadero and $falso; # && y || tienen mayor precedencia
print $verdadero or $falso; # que 'and' y 'or'
# Usa parentesis para seguridad
print ($verdadero and $falso);
```
### Evaluacion de Cortocircuito
```perl
my $x = 0;
# No evaluara la segunda parte si la primera es falsa
if ($x != 0 && 10 / $x > 1) {
print "Condicion cumplida\n";
}
# No llamara a la funcion si la primera es verdadera
if (defined $valor || obtener_valor()) {
# Usar valor en cache o obtener nuevo
}
```
## Operadores Bitwise
### Operaciones Binarias
```perl
my $a = 5; # 0101 en binario
my $b = 3; # 0011 en binario
print $a & $b; # 1 (0001 - AND)
print $a | $b; # 7 (0111 - OR)
print $a ^ $b; # 6 (0110 - XOR)
print ~$a; # -6 (complemento)
print $a << 1; # 10 (0101 << = 1010 - corrimiento izquierdo)
print $a >> 1; # 2 (0101 >> = 0010 - corrimiento derecho)
```
### Manipulacion de Bits
```perl
my $banderas = 0b1010; # 10 en decimal
# Verificar si un bit esta establecido
if ($banderas & 0b1000) {
print "Bit 3 esta establecido\n";
}
# Establecer un bit
$banderas = $banderas | 0b0001; # 1011
# Cambiar un bit
$banderas = $banderas ^ 0b0100; # 1111
```
## Operadores de Asignacion
### Asignacion Compuesta
```perl
my $x = 10;
$x += 5; # $x = 15
$x -= 3; # $x = 12
$x *= 2; # $x = 24
$x /= 4; # $x = 6
$x %= 5; # $x = 1
$x **= 2; # $x = 1
$x .= " hola"; # $x = "1 hola"
# Especifico para cadenas
$x x= 3; # Repetir "1 hola" 3 veces
```
## Rango y Flip-Flop
### Operador de Rango
```perl
# Contexto de arreglo - crea lista
my @nums = (1 .. 10); # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
# Rango de cadenas (secuencias de caracteres)
my @letras = ('a' .. 'z');
my @ALPHA = ('A' .. 'Z');
# Contexto escalar - flip-flop
if (5 .. 10) { # Verdadero cuando la condicion esta en rango 5-10
print "En rango\n";
}
```
## Operadores de Prueba de Archivos
### Pruebas de Archivos
```perl
use strict;
use warnings;
use -e File::Spec; # Para multiplataforma
my $archivo = "test.txt";
# Pruebas basicas de archivo
-e $archivo; # Existe?
-r $archivo; # Legible?
-w $archivo; # Escribible?
-x $archivo; # Ejecutable?
-f $archivo; # Archivo regular?
-d $archivo; # Directorio?
-l $archivo; # Enlace simbolico?
-s $archivo; # Tamano en bytes (retorna tamano o falso)
# Combinado
if (-e $archivo && -w $archivo) {
print "El archivo existe y es escribible\n";
}
```
### Tamano de Archivo
```perl
my $tamano = -s $archivo // 0;
print "Tamano: $tamano bytes\n";
if (-s $archivo > 1024 * 1024) {
print "El archivo es mayor que 1MB\n";
}
```
## Operador Condicional
### Operador Ternario
```perl
my $edad = 25;
my $estado = $edad >= 18 ? "adulto" : "menor";
print $estado; # "adulto"
# Puede anidarse
my $nota = $puntuacion >= 90 ? "A" :
$puntuacion >= 80 ? "B" :
$puntuacion >= 70 ? "C" : "F";
```
## Precedencia de Operadores
### De Mayor a Menor
| Prioridad | Operadores |
|----------|---------------------------|
| 1 | `()` (agrupacion) |
| 2 | `++`, `--` (auto incremento) |
| 3 | `**` (exponenciacion) |
| 4 | `!`, `~`, `+`, `-` (not logico, not bitwise, unario) |
| 5 | `=~`, `!~` (binding de patron) |
| 6 | `*`, `/`, `%`, `x` |
| 7 | `+`, `-`, `.` |
| 8 | `<<`, `>>` (corrimiento) |
| 9 | `-e`, `-r`, etc. (pruebas de archivo) |
| 10 | `<`, `>`, `<=`, `>=` |
| 11 | `==`, `!=`, `eq`, `ne`, `<=>`, `cmp` |
| 12 | `&` (AND bitwise) |
| 13 | `\|`, `^` (OR bitwise, XOR) |
| 14 | `&&` |
| 15 | `\|\|` |
| 16 | `..` (rango) |
| 17 | `?:` (ternario) |
| 18 | `=`, `+=`, `-=`, etc. |
| 19 | `,`, `=>` |
| 20 | `and` |
| 21 | `or`, `not` |
### Usar Parentisis
```perl
# Claro y seguro
if (($a + $b) * $c) { }
# Lo mismo pero relyendo en precedencia
if ($a + $b * $c) { } # $b * $c primero, luego + $a
```
## Resumen
- Aritmeticos: `+`, `-`, `*`, `/`, `%`, `**`
- Incremento: `++$x`, `$x++`, `--$x`, `$x--`
- Cadena: `.` (concatenacion), `x` (repeticion)
- Comparacion numerica: `==`, `!=`, `<`, `>`, `<=`, `>=`, `<=>`
- Comparacion de cadenas: `eq`, `ne`, `lt`, `gt`, `le`, `ge`, `cmp`
- Logicos: `&&`, `||`, `!`, `and`, `or`, `not`
- Bitwise: `&`, `|`, `^`, `~`, `<<`, `>>`
- Pruebas de archivos: `-e`, `-r`, `-w`, `-x`, `-f`, `-d`, `-s`
- Ternario: `condicion ? verdadero : falso`
- Usa parentesis para asegurar la precedencia correcta
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →