5

次のステートメントを実行しているとき:

@filtered = map {s/ //g} @outdata;

期待していたフィルタリングされたリストではなく、空のリストが返されます。私がやろうとしているのは 、文字列の配列(XMLファイル)からすべての出現箇所を削除することです。

明らかに、私は何かを理解していません。誰かがこれを行う正しい方法を教えてもらえますか、そしてなぜこれが私にとってそのままでは機能しないのですか?

4

7 に答える 7

15

マップはソース配列も変更することに注意してください。したがって、次のいずれかを行うことができます。

map {s/ //g} @outdata;

@filtered変数を完全にスキップするか、元の変数を保持する必要がある場合は、

@filtered = @outdata;
map {s/ //g} @filtered;

ただし、その場合は、foreachを使用する方が読みやすい場合があります。

s/ //g foreach @filtered;
于 2008-08-22T04:51:03.680 に答える
10

これを試して:

@filtered = map {s/ //g; $_} @outdata;

問題は、perlのs演算子が$ _を変更するが、実際にはそれが行った変更の数を返すことです。したがって、最後に余分な$ _があると、perlは@outdataの各要素の変更された文字列を返します。

于 2008-08-15T09:49:17.153 に答える
9

グレッグの答えには、 $_ がエイリアスとして渡されるため、元の配列が変更されるという問題があります。必要なもの:

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
于 2008-09-15T14:18:34.320 に答える
6

ティソニウムのポイントをフォローアップするために、これはまたトリックを行います:

@filtered = map {local $_=$_; s/ //g; $_} @outdata;

「ローカル」は、オリジナルではなく、コピーで作業していることを保証します。

于 2008-09-15T14:04:43.807 に答える
5

perl 5.14 では、/r regex 修飾子を使用して非破壊置換を行うことができました。

@filtered = map {s/ //gr} @outdata;
于 2012-05-18T17:31:29.930 に答える
4
use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
于 2008-12-01T03:35:43.613 に答える
3

Greg の回答に対する反論として、grep を誤用する可能性があります。

@filtered = grep {s/ //g; 1} @outdata;

これをしないでください。

于 2008-08-17T15:51:55.073 に答える