如何找到一个元素并删除所有以下元素?

How can I find an element and remove all following elements?

换句话说,我想将这个简单的 C++ 程序移植到 Perl 5:

vector<string> vec { "a", "bb", "ccc", "cd", "ee" };
// find first element starting with "cc"
auto found_it = find_if(begin(vec), end(vec), 
                        [](auto& elem) { return elem.starts_with("cc"); });
// if found, remove all following elements
if (found_it != end(vec)) { vec.erase(found_it + 1, end(vec)); } 

结果应该是("a", "bb", "ccc")

按索引迭代可能会有用

foreach my $i (0..$#ary) {
    if ($ary[$i] =~ /^cc/) {
        $#ary = $i;  # shortens the array: last index is now $i
        last;
    }
}

语法$#arrayname是数组最后一个元素的索引。

一种方法是使用 before_incl from the List::MoreUtils 模块:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
use List::MoreUtils qw/before_incl/;

my @vec = ("a", "bb", "ccc", "cd", "ee");
@vec = before_incl { /^cc/ } @vec;
say "@vec"; # a bb ccc

或者使用循环和 splice:

的更命令的方法
my @vec = ("a", "bb", "ccc", "cd", "ee");
for (my $n = 0; $n < $#vec; $n += 1) {
    if ($vec[$n] =~ /^cc/) {
        splice @vec, $n + 1;
        last;
    }
}

问题的其他 perl 代码变体

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my @vec = ("a", "bb", "ccc", "cd", "ee");
my $regex = qr/^cc/;
my $index = 0;

for( @vec ) {
    last if /$regex/;
    $index++;
}

@vec = @vec[0..$index];

say Dumper(\@vec);