Clasificación de strings mixtas en Perl

La clasificación en Perl se puede realizar con el uso de una función predefinida ‘ordenar’. Esta función utiliza un algoritmo de ordenación rápida para ordenar la array que se le pasa.

Sintaxis: ordenar @array

Devoluciones: una array ordenada

La clasificación de una array que contiene strings en forma mixta, es decir, strings alfanuméricas, se puede realizar de varias formas con el uso de la función sort().

Ejemplo:

Input :  Key_8, pub_12, pri_4 (array of strings) 
Output :  pri_4 Key_8 pub_12

La clasificación de dichas arrays se realiza extrayendo los números de las strings, lo que se puede hacer de dos maneras:

  • Uso de la función substr() : con el propósito de comparar las strings usando los números, es muy esencial obtener números de las strings. Según los números, vamos a ordenar la array de strings. La función substr() se usa para extraer estos números de la string. Esta función toma, no. de caracteres en la string excluyendo el numérico, como parámetro.
    Nota: Todas las strings alfanuméricas de la array deben tener el mismo tamaño.
    Ejemplo:

    use strict;
    use 5.010;
      
    # Defining array values with 
    # alphanumeric strings
    my @x = qw(prin_4 Keys_8 pubg_12);
      
    # Use of sort and substr function 
    # to sort the array
    my @y = sort { substr($a, 5) <=> substr($b, 5) } @x;
      
    # Printing the sorted array 
    print join " ", @y;
    Producción:

    prin_4 Keys_8 pubg_12
    
  • Uso de expresiones regulares: ejecutar el código anterior es un trabajo difícil si la string alfanumérica es un poco compleja, por lo tanto, para mayor simplicidad, podemos usar expresiones regulares.

    Por ejemplo, si la array consta de «Keys_8_keys», entonces es difícil manejar ese caso, por lo tanto, para filtrar correctamente el número de la string, se utilizan expresiones regulares.

    Nota: a este método no le importa si las strings alfanuméricas son de diferentes tamaños.

    use strict;
    use 5.010;
      
    # Sample string to extract 
    # number from
    my $str = 'Key_8_key';
      
    # Regular expression to extract the number
    my ($number) = $str =~ /(\d+)/;
      
    # Printing the extracted number
    print "Number Extracted from Key_8_key is $number\n";
      
    # Defining the array with 
    # Alphanumeric strings
    my @x = qw(pri_4 Key_8_key pubg_12);
      
    # Array before sorting
    print "\nArray Before sorting\n";
    print join " ", sort @x;
      
    # Calling the sort function
    # with Regular Expression
    my @y = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } @x;
      
    # Printing the Array after sorting
    print "\n\nArray After sorting\n";
    print join " ", @y;
    Producción:

    Number Extracted from Key_8_key is 8
    
    Array Before sorting
    Key_8_key pri_4 pubg_12
    
    Array After sorting
    pri_4 Key_8_key pubg_12
    

 
String sin número: si la array consta de strings en las que algunas de las strings no tienen un número, se puede usar 0 en lugar de ese número. Para verificar si no hay un número en la string, se usa el siguiente código:

    my @y = sort { (($a =~ /(\d+)/)[0] || 0)  (($b =~ /(\d+)/)[0] || 0) } @x;  
#!/usr/bin/perl
use strict;
use 5.010;
  
# Array with mixed type of strings
my @x = qw(pri_4 Key pubg_12);
  
# Function call with a Regular Expression
my @y = sort { (($a =~ /(\d+)/)[0] || 0) <=> 
               (($b =~ /(\d+)/)[0] || 0) } @x;
   
# Printing the sorted array
print join " ", @y;
Producción:

Key pri_4 pubg_12

Clasificación usando una subrutina: para una mejor modularización del código, podemos crear funciones o subrutinas separadas en Perl y realizar la operación de clasificación con el uso de esa subrutina. La función sort() aquí toma el nombre de la subrutina como parámetro y llama a la subrutina que contiene la definición para la clasificación.

#!/usr/bin/perl
use strict;
use 5.010;
  
# Defining an array with strings
my @x = qw(Key_8 pri_4 pubg_12);
  
# Calling sort function to sort 
# array using subroutine
my @y = sort numbersort @x;
  
# Printing the sorted array
print join " ", @y;
  
# Subroutine to sort the array
sub numbersort 
{
    my ( $anum ) = $a =~ /(\d+)/;
    my ( $bnum ) = $b =~ /(\d+)/;
    ( $anum || 0 ) <=> ( $bnum || 0 );
}
Producción:

pri_4 Key_8 pubg_12

Publicación traducida automáticamente

Artículo escrito por HbhushanMahajan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *