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

任意の 3 文字に一致させたい場合は、うまくいく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

あなたの質問を読んだ方法は、配列の内容を実際に変更したいということです。次のようにspliceを使用できます。

#!/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 に答える