我有以下数组
@array = qw(1 2 3 3A 3B 4 6)
我想检查我的数组中的元素是否是连续的
我有不同的连续情景。
案例1: 1,2,3,4被认为是连续的;
案例2: 14A,14B,14C,14D应视为连续;
案例3: 1,2,3,3A,3B,4,5也应视为连续的。
检查连续性的窗口是两个,当有不连续性时,我希望在它的位置返回一个星号(*),即考虑@array它应该在4到6之间返回*,因为5缺少,因此返回1 2 3 3A 3B 4 * 6.
虽然下面的代码在我的数组元素与 case 1 类似时有效,但由于@array有 case 3 中的元素,我的条件不起作用,我寻求一个解决这个问题的有效方法,即涵盖所有三种情况。
for ($i=0;$i<=$#array;$i+=2)
{
if($array[$i+1] == $array[$i]+1)
{
print $array[$i],$array[$i+1];
}
else
{
print $array[$i],"*";
}
}
需要考虑的事项:
答案 0 :(得分:2)
你不需要很多东西来解决你的问题:
ord
来比较字母例如,此代码应该完成这项工作:
use warnings;
use strict;
my @array = qw(1 2 3 3A 3B 4 6);
$\ = ' '; # adds a space after each print
for my $i (0 .. $#array-1) {
print $array[$i];
my ($nb1, $letter1) = $array[$i] =~ /(\d+)([A-Z]*)/;
my ($nb2, $letter2) = $array[$i+1] =~ /(\d+)([A-Z]*)/;
if ($nb2 == $nb1 + 1) {
next;
} elsif ($nb2 > $nb1 + 1) {
print '*' for $nb1 .. $nb2 - 2;
} else {
if (! $letter1) {
unless ($letter2 && $letter2 eq 'A') {
print '*';
}
} else {
unless (ord($letter2) == ord($letter1) + 1) {
print '*' for ord($letter1) .. ord($letter2) - 2;
}
}
}
}
print $array[-1]
将打印:
1 2 3 3A 3B 4 * 6