【发布时间】:2016-06-23 15:57:26
【问题描述】:
我有一些 perl 脚本来逐行处理一个文件(包含很多数字)。
文件内容(样本数据,前3个数字用空格隔开,然后隔开的是第3和第4个数字之间的制表符):
1 2 3 15
2 9 8 30
100 106 321 92
9 8 2 59
300 302 69 88
....
脚本内容:
# snippet of script
open(INF, "$infile") || die "Unable to open file $infile: $!\n";
@content = <INF>;
close(INF);
foreach $line (@content) {
# blah blah, script to handle math here
# Now the numbers are stored in separate variables
# $n1 stores the 1st number, i.e.: 1
# $n2 stores the 2nd number, i.e.: 2
# $n3 stores the 3rd number, i.e.: 3
# $n4 stores the 4th number, i.e.: 15
# Solution code to be inserted here
}
我想:
- 对变量$n1、$n2、$n3进行排序,升序输出。
- 在 foreach 结束时,删除重复项
我的做法:
# Insert below code to foreach
$numbers{$n1} = 1;
$numbers{$n2} = 1;
$numbers{$n3} = 1;
@keys = sort { $numbers{$b} <=> $numbers{$a} } keys %numbers;
#push @numbers, "$keys[0] $keys[1] $keys[2]";
$numbers2{"$keys[0] $keys[1] $keys[2]"} = 1;
这定义了两个散列:第一个散列用于排序,第二个散列用于在排序后删除重复项。
有没有更好的方法? 谢谢,
【问题讨论】:
-
所以您根本不想保留第四个数字?删除重复项后你在做什么;特别是,您需要按某种顺序查看结果吗?
-
我是否理解正确 - 您想对每行数字的重复项进行排序和删除,是吗? (所以有些行的数字会更少。)
-
我根本不想保留第四个数字。并且没有重复编号,但排序后有重复行。例如,第 2 行和第 4 行在排序后将是相同的“2 8 9”。
-
@dellair 感谢您的澄清,我现在看到了那行。我已经更新了答案,以便它处理这种情况。请注意,我
split制作$n1等的行用于测试——您的代码不需要它,删除它。如果需要更多/更好的解释,请告诉我。