#!/usr/bin/perl

sub f{($_,$n)=@_;s/(-?\d+)?~(-?\d+)?|(-?\d+)/!(defined$3?$n!=$3:length$1&&$1>$n||length$2&&$n>$2)+0/ge;s/skip/&&!/g;s/,/||/g;eval}

# Testing.

use Test::More;

ok  f('10~20           ', 14);
ok  f('10~20           ', 20);
ok !f('10~20 skip 14~18', 17);
ok  f('~ skip 6        ', 8 );
ok  f('16,17 skip 16   ', 16);
ok !f('(16,17) skip 16 ', 16);
ok  f('~10,5~          ', 8 );
ok  f('~10,5~          ', 4 );
ok  f('6 skip 6,~      ', 6 );
ok  f('-20~-10         ', -14);
ok !f('-20~-10         ', -21);
ok !f('0~2             ', -2);
ok  f('~2              ', -2);
ok !f('0               ', 1);
done_testing;
