我有一个包含 2 x 2 数组的文件。
数据
1: 6.1703
541.631 46.0391
2: 6.1930
537.446 45.9239
3: 6.1931
177.171 288.579
4: 6.1939
167.171 298.579
5: 8.2281
533.686 53.7245
6: 8.6437
519.219 65.0547
7: 9.0823
484.191 95.0753
8: 9.3884
237.75 240.082
9: 9.4701
167.525 246.234
10: 9.7268
411.929 70.7877
我需要查看每个矩阵的位置 (1,2) 的值,如果它接近 6.1937 并且在元素 (2,1) 中具有较大值,则选择它。在此示例中,所选值应为 6.1930。 (这部分已解决如何根据选择比较标准记录数组元素的数量)
其次,我需要选择每个矩阵的位置(2,2)的最高值,然后打印相应的(1,2)元素。在这种情况下,选择的值为6.1939(这部分需要修改剧本)
之前有类似问题的解决方案:
解决方案
#!/usr/bin/perl
use warnings;
use strict;
my $close_to = 6.1937;
my ($close, $lowest);
$/ = q();
while (<>) {
my @arr = split;
if ((! defined $close || abs($arr[1] - $close_to) < abs($close - $close_to))
&& $arr[2] > $arr[3]
) {
$close = $arr[1];
}
if ((! defined $lowest || $arr[1] < $lowest)
&& $arr[2] < $arr[3]
) {
$lowest = $arr[1];
}
if (eof) {
print "$close $lowest\n";
undef $close;
undef $lowest;
}
}
我认为需要在脚本的这一部分中进行修改,但我不知道如何做到这一点。
if ((! defined $lowest || $arr[1] < $lowest)
&& $arr[2] < $arr[3]
) {
$lowest = $arr[1];
}
数据的输出必须是:
6.1930 6.1939
答案1
您确实需要更改代码的这一部分。问题是您现在需要存储两个值:迄今为止找到的最高值和相应的 (1,2) 元素。
#!/usr/bin/perl
use warnings;
use strict;
my $close_to = 6.1937;
my ($close, $highest, $corr_highest);
$/ = q();
while (<>) {
my @arr = split;
if ((! defined $close || abs($arr[1] - $close_to) < abs($close - $close_to))
&& $arr[2] > $arr[3]
) {
$close = $arr[1];
}
if (! defined $highest || $arr[3] > $highest) {
($highest, $corr_highest) = @arr[3, 1];
}
if (eof) {
print "$close $corr_highest\n";
undef $_ for $close, $highest, $corr_highest;
}
}