搜索对象数组,以使用不同的比较运算符匹配可能的多个值

1 arrays perl comparison search operators

我有一个函数来使用eq运算符搜索对象数组中的匹配值,如下所示:

sub find {
    my ( $self, %params ) = @_;
    my @entries = @{ $self->{_entries} };

    if ( $params{filename} ) {
        @entries = grep { $_->filename eq $params{filename} } @entries;
    }
    if ( $params{date} ) {
        @entries = grep { $_->date eq $params{date} } @entries;
    }
    if ( $params{title} ) {
        @entries = grep { $_->title eq $params{title} } @entries;
    }
    ....
Run Code Online (Sandbox Code Playgroud)

我希望能够传入一个qr引用变量来代替比较,但是我能想到分离比较的唯一方法是使用if/else块,如下所示:

if (lc ref($params{whatever}) eq 'regexp') {
    #use =~
} else {
    #use eq
}
Run Code Online (Sandbox Code Playgroud)

这样做的时间更短吗?由于我无法控制的原因,我使用的是Perl 5.8.8,因此无法使用智能匹配运算符.

TIA

rjh*_*rjh 5

这是Perl,所以当然有一个CPAN模块:Match :: Smart.它与Perl 5.10的智能匹配运算符非常相似,只有你输入smart_match($a, $b)而不是$a ~~ $b.

您可能希望与5.10智能匹配的perlsyn文档进行比较,因为Match :: Smart可以处理更多情况.

否则,我没有看到任何错误:

sub smart_match {
    my ($target, $param) = @_;
    if (ref $param eq 'Regexp') {
        return ($target =~ qr/$param/);
    }
    else {
        return ($target eq $param);
    }
}

@entries = grep { smart_match($_->date, $params{date}) } @entries;
Run Code Online (Sandbox Code Playgroud)