2015-03-31 26 views
-2

我想檢查一個字符串是否不止一次出現在一個數組中。我找到了一種方法,但它需要從CPAN安裝一些東西。我沒有root權限可以安裝有問題的CPAN模塊,因此我寧願在不使用CPAN的情況下執行此操作。如何檢查一個字符串是否不止一次出現在數組中?

+1

'的perldoc -f grep' – toolic 2015-03-31 00:28:25

+3

首先,你不必是'root'使用CPAN模塊,但那是另一 話題。第二,**你有什麼嘗試**?你甚至不能寫一個簡單的循環來通過一個數組? – 2015-03-31 00:28:59

+0

您找到的CPAN模塊的名稱是什麼?哪些功能看起來有用?你試過什麼了?您可以通過添加更多信息來稍微改進此問題(這實際上是一個FAQ),以便其他SO用戶可以使用它。 – 2015-03-31 03:07:58

回答

1
my $count = grep $_ eq $word, @array; 

參見perldoc -f grep

爲求值列表的每個元素(在本地設定$_到每個元件)的BLOCK或EXPR並返回由該表達式評估爲真這些元素的列表值。在標量上下文中,返回表達式爲真的次數。

1

編輯:我認爲你的「字符串」不一定是離散的元素。爲了計算完全匹配的每個元素,收緊匹配(即使用/^...$/)或使用eq,正如Sinan在評論中指出的那樣。


你可以指望的次數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」 在這裏。

+0

oops yup'~~'不需要用'if' ...忘記。謝謝。我通常在're.pl'或調試器中使用這些短行數來計算匹配的元素,而不是計算確切的數字。我加載了我最喜歡的模塊(用於計算我使用「'true」「)。我用'grep =「camel」,@ animals'(而不是'eq')多次拋棄了一些東西。對不起,馬虎。將爲後人修復。 – 2015-03-31 01:48:57

+0

@SinanÜnür - 按照評論編輯。謝謝。 – 2015-03-31 02:20:45

1

當向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) { 
    ... 
} 
+0

「'%seen'哈希」似乎是最常用的方法,並且這樣做是正確的(使用'grep $ _eq $ match,@array;'是最簡單的,但更傾向於PEBKAC)。作爲一個獎勵,你可以使'++ $ count {$ _}'看起來簡短而甜蜜:-)不會有更明確的語法(但以其自己的方式含括)像count(「string」,@array)對'List :: Util'或'List :: MoreUtils'做一個有用的補充? – 2015-03-31 02:42:30

+0

所以我想現在我想了解原型? ...或者,如何讓子計數($ @){my $ string = shift; scalar grep $ _ eq $ string,@_}'或'sub count($ @){my $ s = shift;我的%count; @_的++ $ count {$ _};返回$ count {$ s}; 「感覺更」內置「。 – 2015-03-31 03:01:00

+0

只是注意到上述不是我的想法...所以它可能不是那麼糟糕;-) * eg * ['autobox :: Core'](http://www.metacpan.org/pod/autobox ::核心)做了一些類似「核心」的事情,涉及「' - > count()'」:...'說[qw /駱駝松鼠鴨camelhair駱駝鵝/] - >數(「駱駝」)''。但它只是在'autobox :: Core'中的「核心」 – 2015-03-31 14:33:56

相關問題