簡體   English   中英

如何根據正則表達式過濾每個數組元素

[英]How to filter each array elements according to a regex

我有一個像這樣的元素數組:

@ORF= (MEZQFVECQWSXC*FVCXRCT*, MAEZCRTDRX*AZEFZC*AZERC*)

我想分割每個數組,使每個元素以'M'開頭,以'*'結尾,中間沒有多余的'*'

所以我上面的例子應該給我

@ORF = (MEZQFVECQWSXC*,MAEZCRTDRX*)

我考慮過首先像這樣拆分每個元素:

    foreach (@ORF) {
        my $true= split /\*/, $_;
        push @ORF, $true
}

然后使用if語句將其他拼接起來,但這是行不通的。

我也考慮過使用grep

@ORF= grep m/M.*\*/, @ORF;

但這不會影響數組。

我越來越困惑,谷歌沒有幫助...請幫幫我嗎?

您確實可以通過split和loop做到這一點。 您也可以使用map代替for循環。

use strict;
use warnings;
use Data::Printer;

my @ORF= ('MEZQFVECQWSXC*FVCXRCT*', 'MAEZCRTDRX*AZEFZC*AZERC*');
@ORF = map { (split /\*/, $_, 0 )[0] . '*' } @ORF;

p @ORF;

它將遍歷@ORF每個元素,並在*split 第三參數0表示split僅拆分一次。 將返回值視為一個列表,並且只使用第一個元素( [0] ),放回星號,您將獲得一個新的字符串列表,這些字符串以M開頭並以星號結束。

[
    [0] "MEZQFVECQWSXC*",
    [1] "MAEZCRTDRX*"
]

當然,假設只有字符串匹配此模式而無需檢查。


一種簡單的方法是使用substrindex查找*的第一個出現位置,並以字符串的開頭直到該字符為止。 那可能更像是您想對splice ,但是誤解了該操作。

@ORF = map { substr $_, 0 , index($_, '*') + 1 } @ORF;
 foreach (@ORF) { my $true= split /\\*/, $_; push @ORF, $true } 

這實際上非常接近解決方案。 只有幾個問題。

首先,您要將返回值從split給標量變量。 在標量上下文中, split返回它可以將字符串拆分為的項目數,而不是項目本身。 因此,您將只獲得值2。我們可以通過將其指定為列表分配來解決此問題。

my ($true) = split /\*/, $_;

其次,將新值push@ORF 這意味着@ORF只會越來越長,循環永遠不會結束。 您需要用新值替換數組的當前元素。 您可以通過分配$_

因此,整個循環變為:

foreach (@ORF) {
    my ($true) = split /\*/, $_;
    $_ = "$true*";
}

說了這么多,我確實喜歡simbabquemap解決方案

如果願意,還可以使用map + grep,如下所示:

use Data::Dumper;

my @ORF= ("MEZQFVECQWSXC*FVCXRCT*", "MAEZCRTDRX*AZEFZC*AZERC*");
@ORF = grep { $_ =~ /^M/ } map { (split/\*/, $_)[0] . '*' } @ORF;
print Data::Dumper->Dump(\@ORF);

結果:

$VAR1 = 'MEZQFVECQWSXC*';
$VAR2 = 'MAEZCRTDRX*';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM