我被要求执行perl程序以在数组中查找值(来自用户输入)。如果匹配"它确定"。如果不匹配,则检查索引[0]中的值到索引[1] ...索引[n]。那么如果值与两个元素之间匹配,那么报告这些元素附近可能是索引[0]或索引[1]。
让你解释一下。
给定数组:10 15 20 25 30
;
从用户获取值:14(例如)
因此14匹配了两个元素10(array [0]) - 15(array [1])
最终检查点不要使用多个
for
循环,也不要使用while
循环。您需要检查一个for
循环和许多if
条件。
我得到的输出是我在这里做的:
use strict;
use warnings;
my @arr1 = qw(10 15 20 25 30);
my $in = <STDIN>;
chomp($in);
if(grep /$in/, @arr1)
{ } #print "S: $in\n"; }
else
{
for(my $i=0; $i<scalar(@arr1); $i++)
{
my $j = $i + 1;
if($in > $arr1[$i] && $in < $arr1[$j])
{
#print "SN: $arr1[$i]\t$arr1[$j]\n";
my ($inc, $dec) = "0";
my $chk1 = $arr1[$i] + 1;
AGAIN1:
if($in == $chk1)
{ }
else
{ $chk1++; $inc++; goto AGAIN1; }
my $chk2 = $arr1[$j] - 1;
AGAIN2:
if($in == $chk2){ }
else
{ $chk2--; $dec++; goto AGAIN2; }
if($inc > $dec)
{ print "Matched value nearest to $arr1[$j]\n"; }
elsif($inc < $dec)
{ print "Matched value nearest to $arr1[$i]\n"; }
}
}
}
但我的问题是算法中有哪种方法?因此,如果有人可以帮助这个,我们将不胜感激。
提前致谢。
答案 0 :(得分:3)
你似乎决心尽可能地让它变得复杂: - )
您的说明书并不完全清楚,但我认为这样做符合您的要求:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
my @array = qw[10 15 20 25 30];
chomp(my $in = <STDIN>);
if ($in < $array[0]) {
say "$in is less than first element in the array";
exit;
}
if ($in > $array[-1]) {
say "$in is greater than last element in the array";
exit;
}
for (0 .. $#array) {
if ($in == $array[$_]) {
say "$in is in the array";
exit;
}
if ($in < $array[$_]) {
if ($in - $array[$_ - 1] < $array[$_] - $in) {
say "$in is closest to $array[$_ - 1]";
} else {
say "$in is closest to $array[$_]";
}
exit;
}
}
say "Shouldn't get here!";
答案 1 :(得分:2)
使用核心模块List::Util和内置any
中的帮助函数reduce
和abs
。
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/reduce any/;
my @arr1 = qw(10 15 20 25 30);
chomp(my $in = <STDIN>);
if (any {$in == $_} @arr1) {
print "$in is in the array\n";
}
else {
my $i = reduce { abs($in - $arr1[$a]) > abs($in - $arr1[$b]) ? $b : $a} 0 .. $#arr1;
print "$in is closest to $arr1[$i]\n";
}