2

我正在尝试搜索和替换长度不超过 3 个字符的字符串(因此“删除”元素内容)。

所以我有类似的东西:

foreach (@array) {
   s/^{1,3}$//;
}

例如

@array = ('one', 'two', 'three', 'four', 'five', 'six', 'seven');

因此,在打印时,预期输出将是:

result:  result:  result: three  result: four  result: five  result:  result: seven

因此,对于受影响的输入,输出将是一个“空的地方”。

目前这种情况不会发生......我打赌我犯了一个简单的错误,因为我对正则表达式的理解仍然不稳定。任何帮助表示赞赏!

如果有一种简单的方法可以在不创建新数组的情况下完全删除元素,那么了解这一点也很有用。

4

4 回答 4

5

如果要匹配任意三个字符,s/^.{1,3}$//应该可以。我只是在 之后添加了一个点^,因为您的原始正则表达式没有指定您想要匹配 1-3 的字符类型。

于 2012-10-04T13:31:00.897 回答
4

大概 s/^\w{1,3}$//;

您忘记\w将其与{1,3}

于 2012-10-04T13:29:49.970 回答
4

除了简单的正则表达式问题,您可以使用它grep来选择您想要的元素:

@array = grep { !/^.{1,3}$/ } @array;

然后只需打印结果:

print "Result: $_\n" foreach @array;

结果:

Result: three
Result: four
Result: five
Result: seven
于 2012-10-04T13:46:24.710 回答
0

我阅读您的问题的方式是您想要实际修改数组的内容。你可以这样使用拼接

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @array = qw(one two three four five six seven);
my $i = 0;
for (@array) {
    m/^\w{1,3}$/ && splice(@array, $i, 1, undef);
    $i++;
}
print Dumper \@array;
print "\n";
for my $e (@array) {
    print defined $e ? "result: $e  " : "result:  "
}
print "\n";

运行时:

$VAR1 = [
          undef,
          undef,
          'three',
          'four',
          'five',
          undef,
          'seven'
        ];

result:  result:  result: three  result: four  result: five  result:  result: seven
于 2012-10-04T13:44:55.200 回答