📜  在 Perl 中对混合字符串进行排序

📅  最后修改于: 2022-05-13 01:54:25.728000             🧑  作者: Mango

在 Perl 中对混合字符串进行排序

Perl 中的排序可以使用预定义的函数'sort' 来完成。此函数使用快速排序算法对传递给它的数组进行排序。

可以使用 sort()函数以各种方式对包含混合形式的字符串(即字母数字字符串)的数组进行排序。

例子:

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

这些数组的排序是通过从字符串中提取数字来完成的,这可以通过两种方式完成:

  • 使用 substr()函数:为了使用数字比较字符串,从字符串中获取数字是非常必要的。根据数字,我们将对字符串数组进行排序。 substr()函数用于从字符串中提取这些数字。这个函数需要,没有。字符中不包括数字的字符串数,作为参数。
    注意:数组中的所有字母数字字符串的大小必须相同。
    例子:
    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;
    
    输出:
    prin_4 Keys_8 pubg_12
    
  • 使用正则表达式:如果字母数字字符串有点复杂,执行上面的代码是一项艰巨的工作,因此,为了更简单,我们可以使用正则表达式。

    例如,如果数组包含“Keys_8_keys”,那么很难处理这种情况,因此为了从字符串中正确过滤数字,使用正则表达式。

    注意:此方法不关心字母数字字符串的大小是否不同。

    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;
    
    输出:
    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
    


没有数字的字符串:如果数组由其中一些字符串中没有数字的字符串组成,则可以使用 0 代替该数字。要检查字符串中是否没有数字,请使用以下代码:

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;
输出:
Key pri_4 pubg_12

使用子例程排序:为了更好地模块化代码,我们可以在 Perl 中创建单独的函数或子例程,并使用该子例程执行排序操作。这里的 sort()函数以子程序名称为参数,调用保存有排序定义的子程序。

#!/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 );
}
输出:
pri_4 Key_8 pubg_12