domingo, 23 de agosto de 2015

Calcular la longitud de un string


Función length en Perl

La función length trae la longitud de un string.

#Ejemplo
print length("cadena"); # imprime 6


Función strlen en Php

La función strlen devuelve la longitud de un string.

$str 'abecedario';
echo strlen($str); // imprime 10


Propiedad length en Javascript

La propiedad length devuelve la longitud de un string.

var str = "Hello World!";
var n = str.length; // 12

jueves, 20 de agosto de 2015

Unir un array de strings en un solo string



Comando join en Perl

En Perl la función join une los elementos contenidos en un array y forma un único string, usa un separador opcional. Su primer argumento es el separador, el segundo es el array o incluso un hash.

# Ejemplo 1

my %personales = ('apellido'=>'Perez', 'email'=>'perez@example.com');
my $comma_separated = join(",", %personales);

print $comma_separated . "\n"; # email,perez@example.com,apellido,Perez

# Ejemplo 2

my @frutas = ("Banana", "Naranja", "Manzana", "Mango");
my $energy = join('',@frutas);

print $energy . "$/"; # BananaNaranjaManzanaMango 


Comando implode en Php

En Php la función implode une los elementos contenidos en un array y forma un único string, usa un separador opcional. Si no se especifica utiliza el carácter vacío.


// Ejemplo 1

$personales = array('apellido', 'email', 'dirección');
$comma_separated = implode(",", $personales);

echo $comma_separated; // apellido,email,dirección

// Ejemplo 2

$frutas = ["Banana", "Naranja", "Manzana", "Mango"];
$energy = implode($frutas);

alert($energy); // BananaNaranjaManzanaMango 


Comando join en Javascript

En Javascript la función join une los strings contenidos en un array y forma un único string, usa un separador opcional. Si no se especifica el separador, utiliza el carácter ','.

// Ejemplo 1

var personales = new Array('apellido', 'email', 'dirección');
var comma_separated = personales.join(",");

alert(comma_separated); // apellido,email,dirección

// Ejemplo 2

var frutas = ["Banana", "Naranja", "Manzana", "Mango"];
var energy = frutas.join();

alert(energy); // Banana,Naranja,Manzana,Mango 

martes, 18 de agosto de 2015

Separar un string por un delimitador



Comando split en Perl

En Perl la función split devuelve un array de strings como resultado de dividir un array por un carácter delimitador o por un string. Por ejemplo:

# Ejemplo 1
my $pizza  = "porcion1 porcion2 porcion3 porcion4 porcion5 porcion6";
my @porciones = split(" ", $pizza);
print $porciones[0]; # porcion1
print $porciones[1]; # porcion2

# Ejemplo 2
my $data = "foo:*:1023:1000::/home/foo:/bin/sh";
my ($user, $pass, $uid, $gid, $gecos, $home, $shell) = split(":", $data);
print $user; # foo
print $pass; # *


# Ejemplo 3
use Data::Dumper;

my $str = 'one,two,three,four';

# limite positivo
my @count = split(',', $str, 2);
print Dumper(\@count);

# limite negativo no tiene efecto
@count = split(',',$str,-1);
print Dumper(\@count);
$VAR1 = [
          'one',
          'two,three,four'
        ];
$VAR1 = [
          'one',
          'two',
          'three',
          'four'
        ];


Comando explode en Php

En Php la función explode devuelve un array de strings como resultado de dividir un array por un carácter delimitador o por un string. Por ejemplo:

Array
(
    [0] => one
    [1] => two,three,four
)
Array
(
    [0] => one
    [1] => two
    [2] => three
)


Comando split en Javascript

En Javascript la función split devuelve un array de strings como resultado de dividir un array por un carácter delimitador o por un string. Por ejemplo:

// Ejemplo 1
var pizza  = "porcion1 porcion2 porcion3 porcion4 porcion5 porcion6";
var porciones = pizza.split(" ");
alert(porciones[0]); // porcion1
alert(porciones[1]); // porcion2

// Ejemplo 2
var str = "Hola Mundo!";
// sin usar delimitador devuelve el mismo string
var res = str.split();
alert(res); // Hola Mundo! 


// Ejemplo 3
var str = 'one,two,three,four';

// limite positivo
console.log(str.split(',', 2));

// limite negativo no tiene efecto
console.log(str.split(',', -1));
["one", "two"]

["one", "two", "three", "four"]


sábado, 15 de agosto de 2015

Adivina qué número estoy pensando

Juego con Perl POE

En este juego el ordenador piensa un número del 1 al 20 y te da 5 oportunidades para adivinar. Si le erras te da una pista sobre si su número es mayor o menor al número que le dijiste. Para ponerlo más difícil hay un timeout de 10 segundos para que adivines el número o perderás el juego.

Por qué POE

Cuando un programa necesita interacción con el usuario o con datos externos, necesitamos una estructura de programa que sea más expresiva.
POE es un framework para la creación de programas en Perl donde se presentan naturalmente tareas que implican reaccionar ante datos externos o eventos, como las comunicaciones de red o las interfaces de usuario. Los programas en POE son no-lineales, se configuran un montón de pequeñas subrutinas y se define la forma en que se llaman entre sí. POE cambiará automáticamente entre ellas mientras maneja la entrada y salida del programa.

#!/usr/bin/perl -w
use strict;

# Usar POE!
use POE qw/Wheel::ReadLine/;

# Necesitas hacer esto para Cygwin
#$/="\n\r";

# flush STDOUT automaticamente
$|++;


  POE::Session->create(
    inline_states =>
      { _start    => \&handler_start,
        gotLine   => \&handler_gotLine,
        prompt    => \&handler_prompt,
        gameover    => \&handler_gameover,
        timeout   => \&handler_timeout,
        #_stop     => \&handler_stop,
      }
  );

my $limite= 20;
my $intentos_total= 5;
my $intentos= $intentos_total;
my $numero= int(rand($limite-1)) + 1;
print "Adivina el numero$/";
print "Hola!!!, estoy pensando un número del 1 al $limite. ";
print "Tienes $intentos oportunidades para adivinarlo$/";
$poe_kernel->run();
print "\n";

sub handler_start {
  my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];

  # POE::Wheel::ReadLine obtiene la entrada de tu terminal y viene con un historial
  # cuando una nueva linea es ingresada, se ejecuta el evento gotLine
  $heap->{wheel} = POE::Wheel::ReadLine->new
      (
        InputEvent => 'gotLine',
    );

  # pide por el evento prompt para que se ejecute otra vez
  $kernel->yield('prompt');
}
sub handler_prompt {
  my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
  my $tiempo= 10;
  print "Tienes $tiempo segundos para adivinar, o perderás el juego!$/";
  if (2>$intentos){ 
    print "Es tu última oportunidad$/";
  }
  $heap->{wheel}->get('Tipea rápido: ');

  # dispara el evento timeout para dentro de una cantidad de segundos
  $kernel->delay('timeout',$tiempo);
}
sub handler_timeout {
  my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];

  # informar al usuario que perdió
  print "$/El número era $numero, tardaste demasiado tiempo, game over$/";

  # setear esta variable a undef hará que termine nuestro Wheel
  # sin wheel y sin el evento delay pendiente la cola del kernel
  # está vacia y se realiza un shutdown
  $heap->{wheel}=undef;
}

sub handler_gameover {
  my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];

  # informar al usuario que perdió
  print "\nEl número era $numero, lo siento, game over\n";

  # setear un delay sin el número de timeout limpia el evento
  # sin el evento delay pendiente la cola del kernel
  # está vacia y se realiza un shutdown
  $kernel->delay('timeout');
}

sub handler_gotLine {
  my ($kernel, $heap, $session, $arg, $exception) = 
            @_[KERNEL, HEAP, SESSION, ARG0, ARG1];

  if(defined $arg) {
    $heap->{wheel}->addhistory($arg);
    $intentos--;
    if ($numero==$arg){
      print "Excelente! Mi número era el $numero. Lo conseguiste en " . ($intentos_total - $intentos) . " intentos!$/";
      # setear un delay sin el número de timeout limpia el evento
      $kernel->delay('timeout');
      # setear esta variable a undef hará que termine nuestro Wheel
      $heap->{wheel}=undef;
      return;
    }elsif($numero>$arg){
      print "El número es mayor que $arg$/";
    }else{
      print "El número es menor que $arg$/";
    }
    if (1>$intentos){
      # se acabaron las oportunidades para adivinar el número
      $kernel->yield('gameover');
      return;
    }
  }
  else {
    print "Got input exception '$exception'.  Exiting...$/";

    # setear esta variable a undef hará que termine nuestro Wheel
    $heap->{wheel}=undef;
    # setear un delay sin el número de timeout limpia el evento
    $kernel->delay('timeout');

    return;
  }

  # ejecuto el evento prompt de nuevo para resetear el timeout e
  # imprimir un nuevo prompt
  $kernel->yield('prompt');
}

Salida


Adivina el numero
Hola!!!, estoy pensando un número del 1 al 20. Tienes 5 oportunidades para adivinarlo

Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 8
El número es mayor que 8
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 18
El número es menor que 18
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 
              El número era 14, tardaste demasiado tiempo, game over
Adivina el numero
Hola!!!, estoy pensando un número del 1 al 20. Tienes 5 oportunidades para adivinarlo

Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 1
El número es mayor que 1
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 2
El número es mayor que 2
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 3
El número es mayor que 3
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 4
El número es mayor que 4
Tienes 10 segundos para adivinar, o perderás el juego!
Es tu última oportunidad
Tipea rápido: 5
El número es mayor que 5

El número era 13, lo siento, game over
Adivina el numero
Hola!!!, estoy pensando un número del 1 al 20. Tienes 5 oportunidades para adivinarlo

Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 10
El número es mayor que 10
Tienes 10 segundos para adivinar, o perderás el juego!
Tipea rápido: 15
Excelente! Mi número era el 15. Lo conseguiste en 2 intentos!

Desafío

Como tarea final te dejo una modificación para que al finalizar el juego te pregunte que si quieres volver a jugar, y que puedas jugarlo otra vez.