2

私はperlで2D配列を持っています。パターン <<< または >>> を持つすべての要素を削除したい。私はperlコードを書きました。パターンが一致するまではうまく機能しますが、その要素を削除できず、エラーが発生します。

 foreach my $x(@array)
   { 
     foreach my $y(@$x)
     {
        if($y =~ (m/^(\<+)|(\>+)$/ig))
         {
            delete $y;
         }
     }
   }

パターンに一致する特定の要素を削除するのを手伝ってもらえますか? (配列から削除して削除したいのですが、undefではありません)

4

4 に答える 4

2

deleteスカラー値 に適用して$yおり、削除はハッシュと配列にのみ適用されることを意図しています。あなたがする必要があるでしょう

for my $x (0 .. $#array) {
    for my $y (0 .. $#{$array[$x]}) {
        if (...) { delete $array[$x][$y]; }

私の意見では、最善の解決策は、値を配列に格納する前に削除することです。ファイルなどのデータ ソースから読み込んでいると思いますが、それはフィルターで除外するのに最適な場所です。例えば

while (<$fh>) {
    ....
    @values = grep !/^[<>]+/, @values;    # filtering
    push @array, \@values;                # storing
}

その点については、もちろん、次のような方法で後で行うこともできます。

for (@array) {
    @$_ = grep !/^[<>]+/, @$_;
}
于 2013-04-16T12:33:11.350 に答える
1

splice 関数を使用して、配列から要素を削除できます。 splice(@array, $index, 1);この例の 1 は要素の数です。削除する
delete関数は、配列の値を undef に設定するだけです。

于 2013-04-16T12:23:06.260 に答える
0

delete配列インデックスを変更しないため、必要なものではありません。要素を値で削除する場合は、次のようにします。

foreach my $x(@array)
   {   
       $x = [ grep { $_ !~ (m/^(\<+)|(\>+)$/ig)} @$x ];
       print join(",", @$x), "\n";
   }   

または、スプライスを使用します。ただし、値ではなくインデックスを使用して配列を反復処理する必要があります。

Perl-deletePerl-spliceも参照してください。

于 2013-04-16T12:25:23.317 に答える