3

ハッシュテーブルのデータから取得した文字列の配列があります。(どうやら)空の要素を削除しようとしていますが、何らかの理由で、移動を拒否する頑固な要素があるようです。

私がやっている:

# Get list array from hash first, then
@list = grep { $_ ne ' ' } @list; 
@list = uniq @list;
return sort @list;

そのgrepUse of uninitialized value in string ne...で、配列の残りの部分が正しく印刷されたメッセージが表示されます。

私はそれを「長い」方法でやってみました:

foreach (@list) {
    if ($_ ne ' ') {
        push @new_list, $_;
    }
}

しかし、これはまったく同じ結果を生成します。defined期待通りの結果(なし)で使ってみました。

事前に配列を並べ替えて最初の要素を削除することはできますが、データセットに常に空白の要素が含まれることを保証できないため、非常に危険なようです。正規表現に頼るのも過剰に思えますが、おそらく私は間違っています。いつものように、ばかばかしいほど単純なものが欠けていると確信しています。

4

3 に答える 3

5

要素を空にすることはできません。未定義の要素を削除しようとしています。ただし、要素が未定義であるかどうかを確認するのではなく、単一のスペースで構成される文字列で構成されているかどうかを確認します。あなたが欲しい:

@list = grep defined, @list; 
于 2012-11-12T12:27:42.890 に答える
4

私の答えは、空の文字列(未定義または長さが0の文字列)またはスペースのみで構成される文字列が必要ないことを前提としています。

あなたのgrep行は、正確に1つのスペースに等しい文字列のみをテストします。ただし、警告は、少なくとも1つの配列要素が実際にであることを意味しundefinedます。未定義の値をと比較するとeq、単一のスペースではなく、空の文字列に対してのみtrueが生成されます。

したがって、未定義またはスペースのみで構成されるすべてのエントリを削除するには、次のようにします。

@list = grep { defined && m/[^\s]/ } @list;

Perlの場合、空のスペースは真であることに注意してください。したがって、単純なgrep defined, @listものは、実際にはスペースのみで構成されるエントリを破棄しません。

于 2012-11-12T12:44:18.980 に答える
2

スペース以外の文字を含むすべての要素をフィルタリングしたいようです。これを行うだけでなく、未定義の要素を拒否するには、簡単に書くことができます

@list = uniq grep { defined and /\S/ } @list;
于 2012-11-12T15:04:52.110 に答える