4

perlを使用して参照配列をスプライスする方法は? 関数で使用される参照配列から特定の要素を削除しようとしています。

    &removeELement(@spliceArray);

    sub removeELement
    {
        my $ref_to_spliceArray = shift;

        foreach my $i (0 .. $#$ref_to_spliceArray)
        {
              if($ref_to_spliceArray->[$i] == /failed/)
              {
                    splice $ref_to_spliceArray->[$i],1; # this syntax does not work...
              }
        }
    }
4

4 に答える 4

2

コードにいくつかの変更を加えることで、目的の動作を得ることができます。

  • 配列の要素を削除すると、次の要素のインデックスは古い値のインデックスと同じになります。やみくもに繰り返すことはできません0 .. $#ref_to_spliceArray
  • 正規表現バインド演算子はであり、では=~ありません==
  • 未定義の値に対して正規表現を一致させようとすると、警告がトリガーされる場合があります。
  • splice配列の個々の要素ではなく、に配列を渡します。

以下のコードはこれらの問題を修正します。

sub removeElement
{
  my $ref_to_spliceArray = shift;

  my $i = 0;
  while ($i <= $#$ref_to_spliceArray)
  {
    if (defined $ref_to_spliceArray->[$i]
          && $ref_to_spliceArray->[$i] =~ /failed/)
    {
      splice @$ref_to_spliceArray, $i, 1;
    }
    else {
      ++$i;
    }
  }
}

通話を次のように変更します

&removeElement(\@spliceArray);

この構文は、現代の目には古風に見えることに注意してください。一度に1つの要素を覗き見するのではなく、アレイ全体を操作することを検討してください。この単純なケースでは、別のサブを定義する手間をかける必要はありません。

@spliceArray = grep !(defined && /failed/), @spliceArray;

つまり@spliceArray、正規表現と一致しない要素のみを含める必要があります。このdefinedチェックにより、に存在する可能性のある未定義の値に関する警告が防止され@spliceArrayます。

于 2012-05-26T19:43:42.510 に答える
0

正しく使用するには、 manページspliceを参照することをお勧めします。splice

@$aref参照を使用する場合は、単に。ではなく、単に逆参照し$arefます。

手元の問題を解決するには、grep代わりに使用することを検討してください。Windows(二重引用符!)コマンドラインを使用した例を次に示します。

perl -lwe "$x = [qw/a b failed d/]; print for grep ! m/failed/, @$x"

もう1つ、。ではなく、=~とで正規表現を使用します。!~==

そして、あなたは使っstrictていますね?いつもuse strict、いつも!

于 2012-05-26T17:28:35.550 に答える
0

あなたは単にgrepこれに使うことができます:

my @array = qw/foo bar baz qux/;
@array = grep { ! m/baz/ } @array;
# @array now contains foo bar qux

コードにはいくつかの間違いがあります。

  • ==と同じものではありません=~
  • スプライスするオフセットと長さを指定しませんでした(例splice $@aray, $i, 1
  • スプライスが削除され、配列から要素が削除された後、$i配列から項目が削除され、存在しない要素に対して配列がチェックされるため、インデックスは正しくありません。
于 2012-05-26T17:28:38.897 に答える
0

通常、反復しているリストから要素を削除しようとするのは悪い考えです。を使用grepして、保持したい要素のみを含む新しいリストを作成し、元の参照に割り当て直してみてください。

sub removeElement {
    my $ref_to_Array = shift;

    @$ref_to_Array = grep { ! /failed/ } @$ref_to_array;
}

&removeElement(\@someArray);

配列への参照を関数に渡す必要があることに注意してください。

spliceちなみに、探していたあなたへの電話は、

splice @$ref_to_spliceArray, $i, 1
于 2012-05-26T17:35:28.250 に答える