【问题标题】:Search object array for matching possible multiple values using different comparison operators使用不同的比较运算符搜索对象数组以匹配可能的多个值
【发布时间】:2010-05-14 01:04:42
【问题描述】:

我有一个函数可以使用 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;
    }
    ....

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

if (lc ref($params{whatever}) eq 'regexp') {
    #use =~
} else {
    #use eq
}

有没有更短的方法?由于我无法控制的原因,我使用的是 Perl 5.8.8,所以我不能使用智能匹配运算符。

TIA

【问题讨论】:

    标签: perl search arrays comparison operators


    【解决方案1】:

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

    您可能希望与 perlsyn documentation for 5.10 smartmatching 进行比较,因为 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;
    

    【讨论】:

    • +1 向我介绍了一个新模块,我可能只需要在 $work 秘密安装。
    • 现在我知道了 Match::Smart。嗬嗬嗬。
    【解决方案2】:

    我不知道你想要的最终结果是什么,但你可以这样做:

    for my $field (qw(filename date title)) {
      my $p = $param($field};
      @entries = (ref($p) eq 'regexp')
        ? grep { $_->$field =~ /$p/ } @entries
        : grep { $_->$field eq $p }   @entries;
    }
    

    或者,您甚至可以将“eq”比较转换为正则表达式,例如:

    my $entry = "string to be equal to";
    my $re = qr/^\Q$entry\E/;
    

    这简化了 for 循环中的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多