Assuming integers, and given your single and very specific test case, I think ++ikegami's second solution is probably the best.
Here's a solution that's less compact and less efficient:
if ($x =~ /^(?:${\join "|", $y-1 .. $y+1})$/)
My test:
$ perl -E 'my $y = 3; say "$_: ", /^(?:${\join "|", $y-1 .. $y+1})$/ ? + "YES" : "NO" for 1..5' 1: NO 2: YES 3: YES 4: YES 5: NO
Having said that, given another test case with a larger range not centered exactly around $y, this technique may be more appealing. Consider
if ($x==$y or $x==$y-1 or $x==$y-2 or $x==$y-3 or $x==$y+1)
vs.
if ($x =~ /^(?:${\join "|", $y-3 .. $y+1})$/)
My test:
$ perl -E 'my $y = 3; say "$_: ", /^(?:${\join "|", $y-3 .. $y+1})$/ ? + "YES" : "NO" for -1..5' -1: NO 0: YES 1: YES 2: YES 3: YES 4: YES 5: NO
And those hard-coded numbers (in $y-3 and $y+1) could be variables: perhaps, $min_below_y and $max_above_y.
So, as I said, in your very specific example, this technique wouldn't be the best choice; however, in a more general scenario, it could be a better choice.
— Ken
In reply to Re: IF condition with a range
by kcott
in thread IF condition with a range
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |