Regex 将空格放入数字数组perl中

Regex 将空格放入数字数组perl中,regex,perl,Regex,Perl,我有两个字符串在文件中 87 33 21 34 51 及 我将它们读入数组,然后通过tr///ds剪切空白,然后对数组进行排序。 如何用空格分隔数字?因为现在它包含3527107061和 我需要3527107061和8733213451 例如: open(FD, "<", "$input_file") or die "Could not open file '$input_file' $!"; @file_content = <FD>; close (FD); @sort

我有两个字符串在文件中

87 33 21 34 51

我将它们读入数组,然后通过
tr///ds剪切空白,然后对数组进行排序。
如何用空格分隔数字?因为现在它包含3527107061和
我需要3527107061和8733213451

例如:

open(FD, "<", "$input_file") or die "Could not open file '$input_file' $!";
@file_content = <FD>;
close (FD); 

@sorted = sort { $a <=> $b } @file_content;

open(FD),您不希望或不需要删除空格,只需将它们解析为数组即可

my $str1 = '87 33 21 34 51';
my @array_of_numbers = split ' ', $str1; 

print join " ", sort @array_of_numbers; 
如果您在未经修改的情况下进行排序,了解
sort
允许您使用自定义排序参数可能会很有用。因此,这将满足您的需要:

#!/usr/bin/env perl
use strict;
use warnings;

chomp ( my @arr = <DATA> );


print join "\n", sort { $a =~ s/\s+//gr <=> $b =~ s/\s+//gr } @arr;

__DATA__
87 33 21 34 51
35 27 10 70 61 
!/usr/bin/env perl
严格使用;
使用警告;
chomp(my@arr=);
打印join“\n”,排序{$a=~s/\s+//gr$b=~s/\s+//gr}@arr;
__资料__
87 33 21 34 51
35 27 10 70 61 
注意-我们使用
r
regex标志返回,但不进行修改,因此在压缩到一起时,它是基于数字的(数值)排序的,就像您所做的那样


但是,如果结果使用的不是2位数,那么它的行为会有点奇怪。

您不想或不需要删除空格,只需将它们解析为数组即可

my $str1 = '87 33 21 34 51';
my @array_of_numbers = split ' ', $str1; 

print join " ", sort @array_of_numbers; 
如果您在未经修改的情况下进行排序,了解
sort
允许您使用自定义排序参数可能会很有用。因此,这将满足您的需要:

#!/usr/bin/env perl
use strict;
use warnings;

chomp ( my @arr = <DATA> );


print join "\n", sort { $a =~ s/\s+//gr <=> $b =~ s/\s+//gr } @arr;

__DATA__
87 33 21 34 51
35 27 10 70 61 
!/usr/bin/env perl
严格使用;
使用警告;
chomp(my@arr=);
打印join“\n”,排序{$a=~s/\s+//gr$b=~s/\s+//gr}@arr;
__资料__
87 33 21 34 51
35 27 10 70 61 
注意-我们使用
r
regex标志返回,但不进行修改,因此在压缩到一起时,它是基于数字的(数值)排序的,就像您所做的那样


但是,如果结果使用的不是2位数,它的行为会有点奇怪。

您可以在不删除空格的情况下进行排序:

编辑:根据评论,这里是一个仅按第一位数字排序的方法

use Data::Dumper;
use Modern::Perl;

my @arr = ('35 33 21 34 51', '4 27 10 70 61');
@arr = sort { $a =~ s/^(\d+).+/$1/gr <=> $b =~ s/(\d+).+/$1/gr } @arr;
say Dumper\@arr;

您可以在不删除空格的情况下进行排序:

编辑:根据评论,这里是一个仅按第一位数字排序的方法

use Data::Dumper;
use Modern::Perl;

my @arr = ('35 33 21 34 51', '4 27 10 70 61');
@arr = sort { $a =~ s/^(\d+).+/$1/gr <=> $b =~ s/(\d+).+/$1/gr } @arr;
say Dumper\@arr;


为什么要删除空格?因为如果我对数组进行排序,它会显示警告-参数在排序中不是数字。请给我们看一段代码。为什么要删除空格?因为如果我对数组进行排序,它会显示警告-参数在排序中不是数字。请给我们看一段代码。这不是按字母排序,而是按数字排序吗?@Sobrique:是的,是的。但在这种情况下(即只有数字和空格)它是有效的。不,我同意-它适用于这个用例。不过我建议值得注意区别。@Toto:如果数组包含第一个数字为“4”的行,排序就不能按预期工作,因为它会将第4行放在第87行之前。@ViktorPredybaylo:对不起,我不明白,
4
小于
87
是吗?所以它在前面。这不是按字母顺序排序,而是按数字排序吗?@Sobrique:是的,是这样。但在这种情况下(只按数字和空格排序)它是有效的。不,我同意-它适用于这个用例。不过我建议值得注意区别。@Toto:如果数组包含第一个数字为“4”的行,排序就不能按预期工作,因为它会将第4行放在第87行之前。@ViktorPredybaylo:对不起,我不明白,
4
小于
87
是吗?所以它在之前。@Sobrique toolic正在写入,我需要按第一位第一位数字或第一对数字对行进行排序?列表中的其他数字呢?@Sobrique第一对数字,但它可以是一位数字。@Sobrique toolic正在写入,我需要按第一位第一位数字或第一对数字对行进行排序?其余的数字呢列表中的数字是多少?@Sobrique第一对数字,但可以是一个数字。