Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 根据每行上第一个元素的数值对行进行排序?_Perl_Sorting - Fatal编程技术网

Perl 根据每行上第一个元素的数值对行进行排序?

Perl 根据每行上第一个元素的数值对行进行排序?,perl,sorting,Perl,Sorting,我刚刚开始学习Perl,因此我的问题可能看起来很愚蠢。我事先道歉 我有一个列表,比如@data,其中包含从输入读取的行的列表。这些行包含由(未知数量的)空格分隔的数字 现在,我想对它们进行排序并打印出来,但不是按照字典的顺序,而是根据行中出现的第一个数字的数值 我知道这一定很简单,但我不知道怎么做 提前感谢,您可以使用排序功能: @sorted_data = sort(@data); 您可以使用排序功能: @sorted_data = sort(@data); 您可以使用,使用正则表达式捕获

我刚刚开始学习Perl,因此我的问题可能看起来很愚蠢。我事先道歉

我有一个列表,比如
@data
,其中包含从输入读取的行的列表。这些行包含由(未知数量的)空格分隔的数字

现在,我想对它们进行排序并打印出来,但不是按照字典的顺序,而是根据行中出现的第一个数字的数值

我知道这一定很简单,但我不知道怎么做


提前感谢,

您可以使用排序功能:

@sorted_data = sort(@data);

您可以使用排序功能:

@sorted_data = sort(@data);
您可以使用,使用正则表达式捕获行中的第一个数字

use strict;
use warnings;

my @sorted =    map $_->[0],
                sort { $a->[1] <=> $b->[1] }
                map { [ $_, /^(-?[\d.]+)/ ] } <DATA>;
print @sorted;

__DATA__
21  13  14
0   1   2
32  0   4
11  2   3
1   3   3
从后面读取转换,
是我们使用的文件句柄,它将返回文件中的行列表。第一个
map
语句返回一个数组引用
[…]
,该数组引用包含原始行以及在该行中捕获的第一个数字。或者,您可以在这里使用regex
/^(\S+)/
,只捕获首先出现的任何非空白。在比较行时,排序使用数组ref中捕获的数字。最后,最后一个
映射
将数组ref转换回原始值,存储在
$\uu->[0]

请注意,这取决于行的开头有一个数字。如果这可能会丢失或空白,这将产生一些不可预见的后果


请注意,仅使用简单的数字排序也会“起作用”,因为Perl会将一行转换为正确的数字,假设每行以数字开头,后跟空格。您将收到一些警告,例如
参数“21 13 14\n”在排序中不是数字
。例如,如果我将上面的代码替换为

my @foo = sort { $a <=> $b } <DATA>;
my@foo=sort{$a$b};
我将获得输出:

Argument "21    13      14\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "0     1       2\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "32    0       4\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "11    2       3\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "1     3       3\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
0       1       2
1       3       3
11      2       3
21      13      14
32      0       4
参数“21 13 14\n”在foo.pl第6行第5行的排序中不是数字。
参数“0 1 2\n”在foo.pl第6行第5行的排序中不是数字。
参数“32 0 4\n”在foo.pl第6行第5行的排序中不是数字。
参数“11 2 3\n”在foo.pl第6行第5行的排序中不是数字。
参数“13\n”在foo.pl第6行第5行的排序中不是数字。
0       1       2
1       3       3
11      2       3
21      13      14
32      0       4
但正如你所看到的,它已正确排序。我不会建议这个解决方案,但我认为这是一个很好的例子。

您可以使用,用正则表达式捕获行中的第一个数字

use strict;
use warnings;

my @sorted =    map $_->[0],
                sort { $a->[1] <=> $b->[1] }
                map { [ $_, /^(-?[\d.]+)/ ] } <DATA>;
print @sorted;

__DATA__
21  13  14
0   1   2
32  0   4
11  2   3
1   3   3
从后面读取转换,
是我们使用的文件句柄,它将返回文件中的行列表。第一个
map
语句返回一个数组引用
[…]
,该数组引用包含原始行以及在该行中捕获的第一个数字。或者,您可以在这里使用regex
/^(\S+)/
,只捕获首先出现的任何非空白。在比较行时,排序使用数组ref中捕获的数字。最后,最后一个
映射
将数组ref转换回原始值,存储在
$\uu->[0]

请注意,这取决于行的开头有一个数字。如果这可能会丢失或空白,这将产生一些不可预见的后果


请注意,仅使用简单的数字排序也会“起作用”,因为Perl会将一行转换为正确的数字,假设每行以数字开头,后跟空格。您将收到一些警告,例如
参数“21 13 14\n”在排序中不是数字
。例如,如果我将上面的代码替换为

my @foo = sort { $a <=> $b } <DATA>;
my@foo=sort{$a$b};
我将获得输出:

Argument "21    13      14\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "0     1       2\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "32    0       4\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "11    2       3\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
Argument "1     3       3\n" isn't numeric in sort at foo.pl line 6, <DATA> line 5.
0       1       2
1       3       3
11      2       3
21      13      14
32      0       4
参数“21 13 14\n”在foo.pl第6行第5行的排序中不是数字。
参数“0 1 2\n”在foo.pl第6行第5行的排序中不是数字。
参数“32 0 4\n”在foo.pl第6行第5行的排序中不是数字。
参数“11 2 3\n”在foo.pl第6行第5行的排序中不是数字。
参数“13\n”在foo.pl第6行第5行的排序中不是数字。
0       1       2
1       3       3
11      2       3
21      13      14
32      0       4

但正如你所看到的,它已正确排序。我不会建议这个解决方案,但我认为这是一个很好的例子。

这不会做要求的事情,因为它会按字典顺序排序,而不是按要求的数字排序。谢谢,但这会按字典顺序排序,例如-1将出现在-2之前。我想把它们按数字顺序排列。你试过了吗?这将把
10
放在
2
之前。这不会执行要求的操作,因为它会按要求按字典顺序排序,而不是按要求按数字排序。谢谢,但这将按字典顺序排序,例如-1将出现在-2之前。我想把它们按数字顺序排列。你试过了吗?这将把
10
放在
2
之前。非常感谢您的完整解释。我尝试了上述方法,但只是将
替换为
@data
,这是一个包含我的行的列表。但是我得到了以下错误:
在数值比较中使用未初始化值()。/mergedata第53行,第20行。
@ManiBastaniParizi这是因为数组中有一个未定义的值。如果要检查数据,请尝试使用data::Dumper;打印转储文件\@数据@ManiBastaniParizi哦,对了,你说你可以有负值。。。然后你需要一个不同的正则表达式,我会编辑来修正它。我想这是因为数字是实数。其中一些可能以
-
开头,并且可以包含浮点。所以我想我应该改变正则表达式。我是李吗