2017-03-08 68 views
0

我想使用grep(在Perl中)過濾數組中的值。 我的目標是刪除陣列元素,其中「pending」元素爲INVALID_APNS且「token」元素爲空Perl - 使用多個條件的grep過濾數組元素

這不起作用 - 它會刪除所有內容。該陣列包含0個元素後代表,但應包含2.

use constant INVALID_APNS => -1; 
@active_connections = (
    { 
     pending => INVALID_APNS, 
     token=>'123' 
    }, 
    { 
     pending => INVALID_APNS, 
     token=>'123' 
    }, 
    { 
     pending => INVALID_APNS, 
     token=>'' 
    }, 


); 
@active_connections = grep { ($_->{pending} != INVALID_APNS) && ($_->{token} ne '')} @active_connections; 
print scalar @active_connections; 

我做錯了什麼?

回答

3

如果你想排除$_->{'pending} == INVALID_APNS && $_->{'token'} eq ''的記錄,那麼你就是否定那個grep應該包含的內容。無論這些應該做你想要什麼:

! ($_->{'pending'} == INVALID_APNS && $_->{'token'} eq '') 

$_->{'pending'} != INVALID_APNS || $_->{'token'} ne '' 

https://en.wikipedia.org/wiki/De_Morgan%27s_laws

+0

謝謝 - 我似乎在此刻大腦凍結。你的解決方案有效 - 我不明白爲什麼我的錯誤。明天早上我會用一些濃烈的咖啡重新審視這個問題,一旦我得到它,我會將其標記爲已解決。謝謝! – user1361529

+1

@ user1361529「它很大而且是紅色」的相反是「它不是很大或者不是紅色」。 – hobbs

+0

對。我是個白癡。我不能相信我整天都在這上面度過。謝謝 – user1361529