【问题标题】:How can I check if a string appears in an array more than once? [closed]如何检查字符串是否多次出现在数组中? [关闭]
【发布时间】:2015-06-04 04:45:56
【问题描述】:

我想检查一个字符串是否多次出现在数组中。我找到了一种方法,但它需要从 CPAN 安装一些东西。我没有能够安装相关 CPAN 模块的 root 访问权限,因此我宁愿在不使用 CPAN 的情况下执行此操作。

【问题讨论】:

  • 首先,您不必是root 也可以使用CPAN 模块,但这是另一个话题。其次,您尝​​试过什么?你甚至不能写一个简单的循环来遍历一个数组?
  • 您找到的 CPAN 模块的名称是什么?哪些功能看起来很有用?你都尝试了些什么?您可以通过添加更多信息来稍微改进这个问题(这确实是一个常见问题解答),以便它对其他 SO 用户有用。

标签: arrays perl data-structures match


【解决方案1】:
my $count = grep $_ eq $word, @array;

perldoc -f grep

为 LIST 的每个元素计算 BLOCK 或 EXPR(将 $_ 本地设置为每个元素)并返回由表达式计算为 true 的元素组成的列表值。在标量上下文中,返回表达式为真的次数。

【讨论】:

    【解决方案2】:

    在 Stack Overflow 上寻求帮助时,通常希望您向我们展示一些代码来帮助您处理。这里不是学习 Perl 编程速成课程的地方。

    处理这个问题的最通用方法是构建一个哈希,其键是列表中所有不同的值,值是该项目出现的次数。该程序正是这样做来查找多次出现的值

    use strict;
    use warnings;
    use 5.010;
    
    my @animals = qw/ duck goose camel squirrel camel /;
    
    my %counts;
    ++$counts{$_} for @animals;
    
    say for grep $counts{$_} > 1, keys %counts;
    

    输出

    camel
    

    或者,如果你有一个特定的值想要检查它是否出现多次,你可以直接查询哈希

    if ( $counts{goose} > 1 ) {
        ...
    }
    

    【讨论】:

    • %seen hash”似乎是最惯用和最正确的方法(grep $_ eq $match, @array; 是最简单的,但对我来说更容易使用 PEBKAC)。作为奖励,你让++$count{$_} 在这里看起来又短又甜:-) 像count("string", @array) 这样的更明确的语法(但以它自己的方式含糖)不会对List::UtilList::MoreUtils 进行有用的补充吗?跨度>
    • 所以我想现在我想了解原型? ... 或者,嗯,如何让 sub count($@) { my $string = shift; scalar grep $_ eq $string, @_ }sub count ($@) { my $s = shift; my %count; ++$count{$_} for @_ ; return $count{$s} ; } 感觉更“内置”。
    • 只是注意到上面不是我的想法......所以它可能没那么糟糕;-) eg autobox::Core 做了一些感觉“类似核心”的事情涉及“->count()”:...say [qw/camel squirrel duck camelhair camel goose/]->count("camel")。但它只是autobox::Core中的“核心”
    【解决方案3】:

    编辑:我假设您的“字符串”不一定是离散元素。要计算完全匹配的每个元素,请收紧匹配(即使用/^...$/)或使用eq,正如Sinan 在 cmets 中指出的那样。


    您可以计算grep 匹配数组中字符串的次数:

    my @animals = qw/duck goose camel squirrel camel camelback/ ;
    
    if ( scalar ( grep { /^camel$/ } @animals ) > 1 ) { 
       print "more than one" ; 
    }
    

    更短的形式:

    say "more"  if (grep /^camel$/, @animals ) > 1 ;
    say ~~( grep /^camel$/, @animal ); 
    

    ~~”在这里是“scalar”的缩写。

    【讨论】:

    • 哎呀~~不需要if...忘记了。谢谢。我通常在re.pl 或调试器中使用这些短行来计算匹配的元素,而不是计算确切的数字。我加载了我最喜欢的模块(计数我使用“true”)。我不止一次用grep = "camel" , @animals(而不是eq)搞砸了。很抱歉马虎。将为后代修复。
    • @SinanÜnür - 根据评论编辑。谢谢。
    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多