my $rr;
if ($ref->{$ar} && exists $ref->{$ar}->{asc}) {
- $ref->{$ar}->{code} = eval "sub { my \$r=shift; return $ref->{$ar}->{asc}; }" ;
+ my $s = $ref->{$ar}->{asc}; # an optimisation?
+ $s =~ s/\$r/\$_[0]/g;
+ $ref->{$ar}->{code} = eval "sub { $s }" ;
if ($@) {
my $sort = $ref->{sort};
my $name = $ref->{name};
my $key;
my $type = 'Dunno';
my $asc = '?';
+ my $data = ref $_[0] ? shift : \@_;
my $r = @keys > 0 ? 0 : 1;
foreach $key (@keys) {
if ($filter->{reject} && exists $filter->{reject}->{code}) {
$type = 'reject';
$asc = $filter->{reject}->{user};
- if (&{$filter->{reject}->{code}}(\@_)) {
+ if (&{$filter->{reject}->{code}}($data)) {
$r = 0;
last;
} else {
if ($filter->{accept} && exists $filter->{accept}->{code}) {
$type = 'accept';
$asc = $filter->{accept}->{user};
- if (&{$filter->{accept}->{code}}(\@_)) {
+ if (&{$filter->{accept}->{code}}($data)) {
$r = 1;
last;
} else {
my $hops = $self->{hops} if exists $self->{hops};
if (isdbg('filter')) {
- my $args = join '\',\'', map {defined $_ ? $_ : 'undef'} @_;
+ my $args = join '\',\'', map {defined $_ ? $_ : 'undef'} @$data;
my $true = $r ? "OK " : "REJ";
my $sort = $self->{sort};
my $dir = $self->{name} =~ /^in_/i ? "IN " : "OUT";
}
$s .= "(" . join(' || ', @t) . ")";
} elsif ($fref->[1] =~ /^n[ciz]$/ ) { # for DXCC, ITU, CQ Zone
- my @n;
my $cmd = $fref->[1];
- foreach my $v (@val) {
- if ($v =~ /^\d+$/) {
- push @n, $v unless grep $_ eq $v, @n;
- } else {
- my @pre = Prefix::extract($v);
- return ('numpre', $dxchan->msg('e27', $_)) unless @pre;
- shift @pre;
- foreach my $p (@pre) {
- my $n = $p->dxcc if $cmd eq 'nc' ;
- $n = $p->itu if $cmd eq 'ni' ;
- $n = $p->cq if $cmd eq 'nz' ;
- push @n, $n unless grep $_ eq $n, @n;
- }
- }
- }
- $s .= "(" . join(' || ', map {"\$r->[$fref->[2]]==$_"} @n) . ")";
+ my @pre = Prefix::to_ciz($cmd, @val);
+ return ('numpre', $dxchan->msg('e27', $_)) unless @pre;
+ $s .= "(" . join(' || ', map {"\$r->[$fref->[2]]==$_"} @pre) . ")";
+ } elsif ($fref->[1] =~ /^ns$/ ) { # for DXCC, ITU, CQ Zone
+ my $cmd = $fref->[1];
+ my @pre = Prefix::to_ciz($cmd, @val);
+ return ('numpre', $dxchan->msg('e27', $_)) unless @pre;
+ $s .= "(" . "!\$USDB::present || grep \$r->[$fref->[2]] eq \$_, qw(" . join(' ' ,map {uc} @pre) . "))";
} elsif ($fref->[1] eq 'r') {
my @t;
for (@val) {